Funciones de conversión

# Funciones de conversión para crudo
## Metro cubico a barril (_p = precio, _q = cantidad)
conversor_m3bbl_p <- function(x) {x / 6.2898}
conversor_m3bbl_q <- function(x) {x * 6.2898}

# Funciones de conversión para gas
## Pies cúbico a metro cúbico
## 1ft³= 0.02831685m³
conversor_ft3m3_p <- function(x) {x / 0.02831685}
conversor_ft3m3_q <- function(x) {x * 0.02831685}

## Pie cúbico a Millón de BTU
# 1 ft3 =  0.001028 MM BTU
conversor_ft3MMBTU_q <- function(x) {x * 0.001028}
conversor_ft3MMBTU_p <- function(x) {x / 0.001028}

## Millón de BTU a metro cúbico
## 1 MM Btu =  27,8 m3 de gas (IAPG) ó 28.32861 m3 (Canada Energy Regulator)  
conversor_MMBTUm3gas_p <- function(x) {x / 28.32861}
  
## m3 a  MMBTU de gas
# 1 m3 = 0.0353 MM BTU  (Canada Energy Regulator)
# otra opción 1 m3 = 34.121 MM BTU  (BP)
conversor_m3MMBTU_q <- function(x){x * 0.0353}
conversor_m3MMBTU_p <- function(x){x / 0.0353}

## m3 a  MMBTU (Alternativa, revisar)
# conversor_m3MMBTU_q <- function(x){x * 1/27.8}
# conversor_m3MMBTU_p <- function(x){x / 1/27.8}

## Conversión a BEP desde distintas medidas
conversor_m3bep_q <- function(x) {x * 5883}
conversor_MMBTUbep_q <- function(x) {x * 0.17245496} # BP
conversor_MMBTUbep_p <- function(x) {x / 0.17245496}
conversor_bepMMBTU_p <- function(x) {x / 5.798615}

Variables

Producción

Fuentes:

Producción de Crudo

poner en cuanto no coincide, cuanto esta por encima o por debajo, brecha, explicar en qué año se hace el empalme en los precios

La producción de petróleo crudo de largo plazo proviene del Anuario de Combustibles, de la cual contamos datos desde 1911 hasta 1992. Sus valores para el período 1980-1992 coinciden con los de EIA, por lo cual pueden usarse como fuentes alternativas. Asimismo, la evolución de SESCO es similar a la de EIA, salvo por pequeñas divergencias entre 2008 y 2013. La serie de Regalías presenta un nivel menor que las anteriores debido a las deducciones de producción que realizan las empresas para pagar un menor nivel de Regalías hacia las provincias donde realizan la producción. Por último, la serie del Ministerio de Economía coincide con Regalías en sus primeros años, luego presenta un nivel intermedio entre Regalías y SESCO y a partir de 2009 toma a SESCO como fuente. Salvo el Anuario de Combustibles, el resto de las series presentan datos hasta los últimos años. Por lo tanto, el criterio de selección para la serie de producción con la que se realizarán los cálculos es el siguiente:

  • Criterio de cómputo para producicón de crudo:
    • 1911 a 1992: Anuario de combustibles
    • 1993 - actualidad: SESCO Downstream


Tabla 1. Producción de petróleo crudo en Argentina según distintas fuentes (barriles)

Producción de Gas Natural

Al igual que en la producción de petróleo crudo, la serie de largo plazo de producción de gas proviene del Anuario de Combustibles, de la cual contamos datos desde 1913 hasta 1992. A diferencia del crudo, sus valores para el período 1980-1992 no coinciden con los de EIA, pero está última sí coincide con los de Regalías entre 1999 y 2015. En cambio, la serie de SESCO, tiende a continuar la evolución de EIA y Regalías, pero con el nivel del Anuario de Combustibles, por lo que ambos pares de series pueden empalmar coherentemente según su nivel. Nuevamente, los valores de la base de Regalías son menores debido a las deducciones de producción para tributar menos regalías. La serie del Ministerio de Economía toma los valores de SESCO.Por lo tanto, el criterio de selección para la serie de producción de gas para los cálculos es el siguiente:

  • Criterio de cómputo de la producción de gas:
    • 1911 a 1992: Anuario de combustibles
    • 1993 en adelante: SESCO Downstream
Registered S3 method overwritten by 'GGally':
  method from   
  +.gg   ggplot2


Tabla 2. Producción de gas natural en Argentina según distintas fuentes (MMBTU)

Produccion total

Joining, by = c("anio", "unidad")

Precio Mercado Interno

Fuentes:

  • Base Ministerio de Hacienda, Informes Sectoriales
  • Secretaría de Energía-Regalias
    • Por ausencia de información, el precio de regalias entre 1993 y 1998 es el precio total (es decir, es un ponderado que incluye también el precio del mercado externo). En los años posteriores, dicho precio sí corresponde al del mercado interno.
  • Kozulj y Pistonesi. Revista del Instituto de Economía Energética (IDEE) - Fundación Bariloche (1970 - 1988). Precio oficial interno de la cuenca neuquina a tasa de cambio oficial. Las fuentes utilizadas de esta revista son Secretaria de Energía, YPF, Gas del Estado, Boletin Informativo de Techint y series propias de IDEE
  • Memoria Anual y balances contables de YPF (varios años). Precio intero promedio resultante de la relación entre ventas y cantidades producidas.
  • Precios anuario. FALTA BUSCAR

ver de donde sacan el TCC cambiar precio del 92 por mecon estimado y valores restantes por estimado de idee

Precio Mercado Interno de Crudo

  • Criterio para precio_crudo:
    • 1963 a 1965: Kozulj y Pistonesi - Revista IDEE ajustado con el índice del precio del Anuario de YPF
    • 1989 a 1991: Anuario de YPF
    • 1966 a 1988: Kozulj y Pistonesi - Revista IDEE
    • 1992: MECON ajustado con la variación del Índice de precios internos al por mayor (IPIM)
    • 1993 en adelante: MECON


Tabla 3. Precio del mercado interno del petróleo crudo en Argentina según distintas fuentes (barriles)

Precio Mercado Interno de Gas Natural

  • Precio Mercado Interno de gas:
    • 1963 - 1969 & 1989 - 1992: Anuario de YPF
    • 1970 - 1988: Kozulj y Pistonesi - Revista IDEE
    • 1993 en adelante: Secretaría de Energía - Base Regalías


Tabla 4. Precio del mercado interno del gas natural en Argentina según distintas fuentes (barriles)

Precios de Referencia del Mercado Mundial

Precios de exportación desde Argentina, benchmarks y Precios del mercado de EEUU (solo gas, internos y de expo/impo)

Precios de Referencia del Crudo

  • Fuentes seleccionadas para precio_me_crudo:
    • entre 1962 y 1992: precio de exportación argentina de UN Comtrade (clasificación SITC as reported)
    • entre 1993-2001 y 2004-2014: precio de exportación argentina de Mecon
    • entre 2002 y 2003: precio de exportación de Argentina de UN Comtrade (Clasificación HS as reported)
    • 2014 en adelante: precio de exportación argentina de Secretaría de Energía (Regalías)
    • Valores faltantes previos a 1992 (1970 - 1985): Brent (Fuente: Inflation Data)

Falta construir una paridad de expo/impo con el flete

Precios de Referencia del Gas

  • Criterio de precio_externo_gas:
    • Años 1964 y 1965: Precio de importación de gas proveniente de Bolivia hacia Argentina de UN Comtrade
    • 1966 en adelante: Precio de exportacion de gas desde Bolivia a Argentina de UN Comtrade
    • Datos faltantes para los años previos a 1963 y período 1968-1971
Exportación Argentina
Referencias mundiales
Bolivia
Todos los precios

buscamos un precio

cuanto es una cantidad de btu de gas al precio de referencia (ej bolivia) y cuanto es si convierto esos btu a barriles y los valorizo con el precio del barril? cuanto queda la unidad en btu si tomo el precio de petroleo y lo covierto a btu. es decir, cuanto es el valor si la valorizo en precio del petroleo

¿cuantos usd es un btu de petroleo? si tomo un barril de petroleo y lo convierto a btu ( me va a dar cuantos usd es un btu) luego comparo los usd/btu y lo comparo con el gas de bolivia

grinber: convierte todo el gas en petroleo y le pone el precio de petroeloe. subestima los precios del gas?

Exportaciones e Importaciones

Exportaciones e Importaciones de Crudo

  • Exportaciones de Crudo:
    • 1962 a 1993: UN Comtrade
    • 1994 en adelante: SESCO Downstream
    • Los datos faltantes de SESCO se completaron con MECON
    • Siguen habiendo datos faltantes para los años 1965, 1970-74, 1976-78, 1980-84

Exportaciones e Importaciones de Gas

  • Fuentes seleccionadas:
  • 1962 a 1996: UN Comtrade,
  • 1997 en adelante: SESCO Downstream
  • Datos faltantes para los años 1999 y 2000

Regalías

  • Fuentes:
    • Secretaría de Energía (Base Regalías)

REVISAR EL CALCULO DE BETANIA cuanto ganarian las provincias si el precio del mercado interno se acomoda al internacional?

Subsidios

Joining, by = "anio"
NAs introducidos por coerci昼㸳n

Pozos

Metros perforados

Fuente:

Pozos en operación

Fuentes:

  • Secretaría de Energía - Datos MINEM:
    • Listado de pozos cargados por empresas operadoras: se toma la variable “Fecha del Fin de terminación de perforación del pozo” (adjiv_fecha_fin_term) como año de puesta en producción del pozo. Se podría elaborar un stock de pozos a partir de acumular los pozos terminados y restando los pozos abandonados, agrupando con la variable “Fecha de abandono del pozo”(adjiv_fecha_abandono)
    • Pozos terminados
    • Capítulo IV
    • Estado de pozos (AUN NO SE PROCESÓ ESTA BASE NI LA ANTERIOR)
    • SESCO
  • IAPG. Se presentan dos series: una elaborada a partir de los pozos perforados por año (resultante de descargar una base por cada año del sitio web oficial) y otra que corresponde al stock de pozos de petróleo de extracción efectiva (procedente de los datos de Estadísticas del Centenario de IAPG).

ver relaciones * PBI hidrocarburos / PBI total (ver cual elegir) * corregir nuestro VBP depurando servicios * MIP’s coef tecnico (para ver CI en el sector petrolero y peso del sector petrolero en PBI)

  • stock petrolero / stock total JIC,EM
  • Stock extraccion = PPyE PAE + PPyE Tecp + PPyE Petrobras upstr + Activo YPF upstream
    • ver que porcentaje que representan estas empresas en la produccion o pozos y ver de ampliarlo
    • ver relacion Activo YPF upstream / PPyE integrada YPF
    • ver relacion ganancias AFIP y BOLSAR con el stock correspondiente (coherencia)
    • ver relacion con Coremberg
    • pasar ENGE

grinberg convertir lo nuestro a costos. agarrar nuestros valor y dividirlo por barriles (sumando gas en BOE) * costos por bbl, precio el barril y precio de produccion (sumo la gcia normal al costo1)

Activos

Pasar datos de bs de uso en yacimientos para armar relación activo yacimeinto/total

Fuentes:

  • Balances de Bolsar (unicamente empresas que cotizan en la bolsa de valores argentina). Revisar el stock del sector distribución porque se presenta demasiado grande con respecto al de los demás. Falta pasar los datos del activo de casi todas las empresas

  • AFIP. Con esta fuente no tenemos calculo de renta, sino que solo usamos la TG como parámetro. Nota: "_c" significa casos presentados de la variable correspondiente

  • Memorias de YPF. La década de los 80 presenta picos que hay que revisar

  • Calculo del Capital Total Adelantado (KTA)

    • Bolsar: Es equivalente a la suma de Propiedad, Planta y Equipos Neta (descontando los terrenos y obras en curso) y los Inventarios. Cuando los datos lo habilitan, se le agregó los salarios adelantados (salarios y cargas consumidos sobre rotación). Luego, cuando no se presentaron datos de Propiedad, Planta y Equipos, se tomó el activo no corriente.
    • AFIP: Es equivalente a la suma de Bienes de Uso, Bienes de Cambio, Inventarios y Disponibilidades.
    • Memoria YPF: Suma de Bienes de Uso y Bienes de Cambio

Stock total de la rama

Stock de segmentos de YPF y Petrobras

Stock por empresas

YPF largo plazo

Comparación entre la Memoria YPF (recopilado por BFR) y los balances extríados de Bolsar

Estimación de stock de capital a partir de la evolución de pozos perforados

El ejercicio consiste en verificar si los pozos terminados sirven como indicador de la inversión y, por lo tanto, de aproximador al stock de capital adelantado. Para ello se parte de un año base de la serie de Propiedad, Planta y Equipo del sector extracción de Bolsar y AFIP, para luego indexar las variables por la evolución de los pozos. Los balances de Bolsar que corresponden únicamente a extracción son dos: PAE y Tecpetrol, por lo que el valor obtenido puede estar subrepresentado para dar cuenta del total de la rama. Con respecto al índice de pozos, se tomaron dos series alternativas: una construída a partir del stock de pozos en extracción efectiva (fuente: IAPG) y otra elaborada con los pozos terminados anuales cargados por empresa operadora (fuente: Secretaría de Energía).

El año base elegido es 2006, dado que es el último dato que poseemos del stock de pozos totales en actividad de IAPG.

Se realizó la misma estimación para YPF, filtrando las variables de Propiedad, Planta y Equipo (para el total de la empresa, por lo que incluye no sólo extracción sino refinación y otros rubros) y activo total del upstream. Se utilizó únicamente el indice de pozos terminados anuales de YPF para estimar la PPyE y el activo, dado que no se posee valores del stock de pozos en perforación para los años en donde existen valores contables que sirvan de año base. Luego, se estimó un stock de capital total de rama a partir de ponderar el stock de YPF por la relación entre los pozos de YPF y los pozos totales de la rama.

En síntesis, el listado de variables estimadas- a partir de las dos series de pozos (stock y flujo),salvo para la estimación de YPF que solo se pudo hacer con flujo de pozos por ausencia de información- es las siguientes:

  • \(ppye\_estimado\_bolsar\) = \(PPyE\ año\ base\ de\ Bolsar\) * \(indice\ de\ pozos\)

  • \(ppye\_estimado\_afip\) = \(PPyE\ año\ base\ de\ AFIP\) * \(indice\ de\ pozos\)

  • \(ppye\_estimado\_ypf\) = \(PPyE\ año\ base\ de\ YPF\) * \(indice\ de\ pozos\ YPF\)

  • \(activo\_estimado\_upstream\_ypf\) = \(Activo\ año\ base\ de\ YPF\) * \(indice\ de\ pozos\ YPF\)

  • \(ppye\_estimado\_total\) = \(ppye\_estimado\_ypf\) * \[\frac{pozos\ totales}{pozos\ de\ YPF}\]

  • \(activo\_estimado\_upstream\) = \(activo\_estimado\_upstream\_ypf\) * \[\frac{pozos\ totales}{pozos\ de\ YPF}\]

Para poder seleccionar la estimación más adecuada, se realizó un análisis de correlación entre todas las series estimadas y los valores contables que se poseen de PPyE de AFIP, Bolsar e YPF. Se presentan distintos cuadros de correlaciones, con sus nivles de significancia, diagramas de dispersión entre variables y su distribución. Las series construídas que poseen mejor correlación son la Propiedad, Planta y Equipo a partir de Bolsar estimadas con índice de stock de pozos (correlación fuerte de 0.89 y significativa al 0.001) y flujo de pozos (correlación moderada de 0.54 y significativa al 0.05) y luego el activo del upstream total de la rama a partir de YPF (correlación moderada de 0.42 y significativa al 0.1 con los valores contables de YPF y correlación fuerte de 0.88 y significativa al 0.001 con las estimaciones de PPyE de AFIP y Bolsar a partir de flujo de pozos).

la estimación tiene que realizarse con PPyE porque hay que excluir salarios e inventarios (que están en KTA)

Análisis de correlacion entre Propiedad, Planta y Equipo y Pozos en producción

reemplazar ipc por un ibif o indice especifico

Total rama

                  ppye_afip ppye_bolsar pozos_iapg pozos_terminados pozos_cargados
ppye_afip         1.0000000   0.1743854 -0.2930975       -0.6054224     -0.3793896
ppye_bolsar       0.1743854   1.0000000 -0.4269400       -0.5803358     -0.3213849
pozos_iapg       -0.2930975  -0.4269400  1.0000000        0.8924037      0.9611781
pozos_terminados -0.6054224  -0.5803358  0.8924037        1.0000000      0.8696256
pozos_cargados   -0.3793896  -0.3213849  0.9611781        0.8696256      1.0000000

Stock de pozos

             ppye_afip ppye_bolsar pozos_iapg
ppye_afip    1.0000000   0.8382675 -0.9152596
ppye_bolsar  0.8382675   1.0000000 -0.9096424
pozos_iapg  -0.9152596  -0.9096424  1.0000000

YPF
                activo_upstream ppye_integrada      pozos
activo_upstream       1.0000000     0.22492855 0.51192183
ppye_integrada        0.2249285     1.00000000 0.06456351
pozos                 0.5119218     0.06456351 1.00000000

PPyE y activo upstream total rama a partir de YPF
`summarise()` has grouped output by 'anio'. You can override using the `.groups` argument.
Joining, by = "anio"
Joining, by = "anio"

Inversiones

Fuentes:

  1. construir serie de inversión para atras (buscar Stock de YPF pero solo para extracción). armar ejercicio de FD y ver si las proporciones se mantienen.
  • Reconstruccion de serie de inversion por empresa ver un flujo de pozos y un flujo de inversion y luego ver si lo que mueve la inversion son los pozos (que su evolucion sea similar).

  • inversion por empresa (balance: variacion del activo + consumo de K fijo)

  • inversion por empresa (secretaria de energia)

  • inversion agregada (tipo de inversion) (cuentas nacionales?)

  • pozos nuevos por empresa por año

  • pozos nuevos totales

  • aplicar MIP para YPF

Inversión a partir de Balances

Inversión a partir de Secretaria de Energía

Análisis de correlación entre Inversión y Pozos

  • buscar correlacion, para ver si la serie de inversión se mueve similar a los pozos
  • usar stock y ademas usar variacion de stock (bs de uso)

Con pozos de IAPG

Con pozos Cap IV

Valor total de la producción y ganancia

Valor Bruto de la Producción, Valor Agregado y Consumo Intermedio

Se presentan a continuación distintas estimaciones del Valor Bruto y Agregado de Producción (VBP y VA), Consumo Interemedio (CI) y Excedente Bruto de Explotación (EBE). Esta última partida constituye la plusvalía (PV) total de la rama, es decir, la suma de la renta de la tierra (RT) más la ganancia normal (Gnorm), y se obtiene luego de descontar del VA sus respectivos CI, MS, impuestos específicos (Imp) y depreciación de capital o consumo de capital fijo (ConsKfijo). Las distintas series presentadas se construyeron siguiendo los siguientes criterios que luego se observarán en la formulación matemática:

  • CCNN (vbp_va_ci_ccnn y pv_hidrocarburos_ccnn)
    • Valores contables oficiales de las Cuentas Nacionales (sólo disponible para el período 2004-2012). Dado que se posee información del salario promedio del sector y el empleo, se pudo obtener la MS resultante. A partir de estos datos se elaboró un coeficiente que refleja el promedio de la proporción de la MS sobre el VBP (sin distinguir extracción y sus respectivos servicios de apoyo) que se utilizará en los cálculos posteriores. Se podria afinar una MS solo de extracción.
  • Criterio CCNN (vbp_va_ci_propia)
    • Estimación propia de los valores contables a partir de las fuentes recopiladas, siguiendo los criterios de las Cuentas Nacionales. Es decir, para obtener el VBP se valua la producción destinada al mercado interno (resultante a partir de la diferencia entre producción y exportaciones) con los precios internos y las exportaciones con los precios de exportación o referencia internacional, con tipo de cambio comercial (TCC). Este VBP no tiene descontado los servicios auxiliares a la extracción de hidrocarburos. El Consumo Intermedio se estima a partir del coeficiente técnico de la MIP de 1997 sobre el VBP mencionado anteriormente. De igual manera, para calcular la masa salarial se aplicó el coeficiente mencionado en el párrafo anterior sobre el VBP aquí resultante. Finalmente, como se mencionó anteriormente, el VA el EBE se calcularon a partir de las diferencias mencionadas anteriormente. Esta estimación de VBP no tiene descontado los servicios de apoyo a la extracción.

CCNN reestimado (vbp_ccnn) + Estimacion que toma los valores oficiales de las cuentas nacionales para el período que hay valores (2004 -2012), e imputa los valores faltantes por medio de la evolución de un índice del VBP propio con criterio CCNN. Cabe subrayar que el valor base del VBP tiene descontado los servicios de apoyo a la extracción, pero no así el VBP utilizado en el índice. El CI se estimó a partir de aplicar el coeficiente técnico sobre esta estimación del VBP, por lo qeu sería un CI sólo de extracción. Se utilizaron los valores oficiales de la MS cuando se encontraba disponible el dato, mientras que se procedió a imputar los faltantes por medio del coeficiente sobre el VBP. Como en todos los casos, el VA y EBE surgen como diferencia de las partidas anteriores.

Criterio Propio (pv_hidrocarburos_propia) + Estimación propia que refleja con mayor precisión el valor de la riqueza presente en el sector. El VBP se obtiene a paritr de valuar la totalidad de la producción a los precios externos o de referencia internacional y con el tipo de cambio de paridad (TCP), que mide la capacidad real de compra de la moneda nacional. Sin embargo, como el CI constituyen intercambios de mercancías realizadas en el ámbito nacional, dicha partida se obtiene a partir de los valores obtenidos en los cálculos de criterio CCNN. Es decir, el CI es calculado con el coeficiente técnico sobre el VBP con produccion local valuada a precios internos y exporaciones a precios externos con TCC. Asimismo, de igual manera que en Criterio CCNN, la MS se estimó a partir del coeficiente promedio (obtenido sobre los valores oficiales de CCNN) sobre el VBP estimado con criterio propio, y el VA y el EBE a partir de las diferencias entre las partidas anteriores. Es importante subrayar que este cálculo de VBP no tiene descontado los servicios de apoyo a la extracción.

Criterio Propio con VBP de CCNN (pv_hidrocarburos) + Toma el VBP de criterio propio y para obtener el VA, se le descuenta el CI de extracción de CCNN restimado (sin embargo, como se dijo, el VBP no tiene descontado los servicios). Se utilizó tambien la MS estimada en CCNN restimado. El EBE surge como diferencia de las partidas.

Formulación matemática de los cálculos

  • VBP con criterio propio

\[VBP_{propia} = (Pext_{petróleo} * Q_{petróleo} + Pext_{gas} * Q_{gas}) * TCP\]

  • VBP con criterio CCNN

\[VBP_{CCNN} = (Pint_{petróleo} * QMInt_{petróleo} + Pext_{petróleo} * Expo_{petróleo} + Pint_{gas} * QMInt_{gas} + Pext_{gas} * Expo_{gas})* TCC\]

Donde:

  • \(VBP_{propia}\) = Valor Bruto de la Producción, estimación propia
  • \(VBP_{CCNN}\) = Valor Bruto de la Producción, estimación propia con criterio de las CCNN
  • \(Pext_{petróleo}\) = Precio de exportación/referencia internacional del petróleo crudo
  • \(Pext_{gas}\) = Precio de exportación/referencia internacional del gas natural
  • \(Pint_{petróleo}\) = Precio mercado interno del petróleo crudo
  • \(Pint_{gas}\) = Precio mercado interno del gas natural
  • \(Q_{petróleo}\) = Cantidades producidas totales de petróleo crudo
  • \(Q_{gas}\) = Cantidades producidas totales de gas natural
  • \(QMInt_{petróleo}\) = cantidades vendidas al mercado interno de petróleo crudo
  • \(QMInt_{gas}\) = cantidades vendidas al mercado interno del gas natural
  • \(Expo_{petróleo}\) = exportaciones de petróleo crudo
  • \(Expo_{gas}\) = exportaciones de gas natural
  • \(TCC\) = Tipo de Cambio Comercial
  • \(TCP\) = Tipo de Cambio de Paridad

\[ CI_{propia} = VBP_{CCNN} * Coef\_tec \]

\[VA_{propia} = VBP_{propia} – CI_{propia} \]

Donde:

  • \(CI_{propia}\) = Consumo Intermedio, estimación propia
  • \(VA_{propia}\) = Valor Agregado, estimación propia
  • \(Coef\_tec\) = Coeficiente técnico de Matriz Insumo Producto

\[MS_{propia} = W * Emp * 13\]

Donde:

  • \(MS_{propia}\) = Masa Salarial, estimación propia
  • \(W\) = Salario anual promedio
  • \(Emp\) = Empleo

\[ConKfijo = PPyE * prom(\frac{Dep}{PPyE}) \]

Donde:

  • \(ConKfijo\) = Consumo de Capital Fijo
  • \(PPyE\)= Propiedad, Planta y Equipo neta
  • $prom() $ = tasa de depreciación promedio
  • \(Dep\) = Depreciaciones (cuenta gastos)

\[PV_{propia} = VA_{propia} – MS_{propia} – ConKfijo - IMP \]

Donde:

  • \(PV_{propia}\) = Plusvalía (Excedente Bruto de Explotación)
  • \(IMP\) = Impuestos normales

En los casos en los que se presenta dato de consumo intermedio y masa salarial de las CCNN, se realizó el reemplazo de los datos estimados por los registrados en CCNN.

Con respecto a la estimación propia, el consumo intermedio se estimó a partir de multiplicar el Valor Bruto de Producción por el coeficiente técnico resultante del Cuadro de Utilizacion de INDEC año 2004 (obtenido a partir del ratio CI/VBP). Su valor es igual 0.369, lo cual no está alejado del coeficiente promedio resultante de la serie de Valor de la Producción en base a cuentas nacionales (0.412). Sí se encuentra más alejado del coeficiente de la MIP base 1997 (0.272).

Por su parte, la masa salarial se calculó como la multiplicación entre la remuneración promedio de la rama por el empleo registrado por los 12 meses del año más el aguinaldo. Los años faltantes se completaron por medio de multiplicar el VBP por el peso promedio de la masa salarial para los años con datos. Un método similar aplica Dachevsky: resulta de multiplicar el VBP por la proporción entre la remuneración a los asalariados sobre el valor total de producción de YPF para el año 1973/1963.

El consumo de capital fijo surge de aplicar la tasa de depreciación promedio resultante de los balances de YPF (1998 - 2018) al stock de capital adelantado estimado (ver apartado Estimación de stock de capital a partir de la evolución de pozos perforados). Dicho promedio resulta en torno al 12% del stock de capital

Corrección VPB

Cuadro utilizacion de oferta peso de los servicios = Servicios petroleo/extraccion = 10,7% (2)

años 2004-2011 aplicamos coef a base mineria/hidrocarburos CCNN VBP extraccion( CCNN) = VBP extraccion y servicios (CCNN) * 0,893 (1)

1910 - 2018 armar indice VBP criterio CCNN para mover (1) los años que nos faltan (1910 - 2004 y 2012 -2018) deberia ser = que aplicar coef (2) a VBP

Fuentes para la construcción de series

  • Producción de Crudo:
    • 1911 a 1992: Anuario de combustibles
    • 1993 - actualidad: SESCO Downstream
  • Exportaciones de Crudo:
    • 1962 a 1993: UN Comtrade (clasificación SITC as reported)
    • 1994 en adelante: SESCO Downstream
    • Los datos faltantes de SESCO se completaron con MECON
    • Siguen habiendo datos faltantes para los años 1965, 1970-74, 1976-78, 1980-84
  • Precio Mercado Interno de Crudo:
    • 1963 a 1965: Kozulj y Pistonesi - Revista IDEE ajustado con el índice del precio del Anuario de YPF
    • 1989 a 1991: Anuario de YPF
    • 1966 a 1988: Kozulj y Pistonesi - Revista IDEE
    • 1992: MECON ajustado con la variación del Índice de precios internos al por mayor (IPIM)
    • 1993 en adelante: MECON
  • Precio Mercado Externo Crudo:
    • entre 1962 y 1992: precio de exportación argentina de UN Comtrade
    • entre 1993-2001 y 2004-2014: precio de exportación argentina de Mecon
    • entre 2002 y 2003: precio de exportación de Argentina de UN Comtrade (Clasificación HS as reported)
    • 2014 en adelante: precio de exportación argentina de Secretaría de Energía (Regalías)
    • Valores faltantes previos a 1992: Brent (Fuente: Inflation Data)
  • Producción de Gas:
    • 1911 a 1992: Anuario de combustibles
    • 1993 en adelante: SESCO Downstream
  • Exportaciones de gas:
    • 1962 a 1996: UN Comtrade,
    • 1997 en adelante: SESCO Downstream
    • Datos faltantes para los años 1999 y 2000
  • Precio Mercado Interno de gas:
    • 1963 - 1969 & 1989 - 1992: Anuario de YPF
    • 1970 - 1988: Kozulj y Pistonesi - Revista IDEE
    • 1993 en adelante: Secretaría de Energía - Base Regalías
    • El dato del año 1992 se dividió por 10, dado que resultaba excesivamente alto, lo cual es metodológicamente inaceptable pero sirve de ejercicio.
  • Precio Mercado Externo:
    • Años 1964 y 1965: Precio de importación de gas proveniente de Bolivia hacia Argentina de UN Comtrade
    • 1966 en adelante: Precio de exportacion de gas desde Bolivia a Argentina de UN Comtrade
    • Datos faltantes para los años previos a 1963 y período 1968-1971
  • Valor Bruto de la Producción, Valor Agregado y Consumo Intermedio:
    • INDEC - Dirección Nacional de Cuentas Nacionales (Base Minería e Hidrocarburos de las Cuentas Nacionales). Las variables “extraccion_y_servicios_hidrocarburos” refieren a “Extracción de petróleo crudo y gas natural. Actividades de servicios relacionadas con la extracción de petróleo y gas, excepto las actividades de prospección”
    • Cálculo propio del VBP con datos datos de producción y precio internacional recopilados. Las fuentes son las siguientes (los criterios son los mismos para la utilización posterior en el cálculo de renta de la tierra hidrocarburífera por diferencial de precios, sobrevaluación cambiaria y otros mecanismos)
  • Salario y empleo

Estimación por Cuentas Nacionales

Estimaciones en base a fuentes recopiladas. Metodología propia y CCNN

Empleo, Remuneraciones y Masa Salarial (CCNN)

Plusvalía total del sector

[1] 0.0005121029
Joining, by = "anio"

Cálculos de Tasa de Ganancia

\[TG_{hidrocarburos} = \frac{PV_{hidrocarburífera}}{KTA_{hidrocarburífero}}\]

Renta apropiada por las empresas de la rama

La renta apropiada por las empresas de la rama se calcula por medio del diferencial de tasas de ganancia entre el sector hidrocarburífero que surge a partir de los balances y la rentabilidad normal de la economía.

\[Renta\_empresas = KTA_{hidrocarburífero} * (TG_{hidrocarburífera} - TG_{referencia})\] \[TG_{hidrocarburífera} = \frac{Gcia_{hidrocarburos}}{KTA_{hidrocarburífero}}\] Por lo cual, la renta apropiada por las empresas de la rama sería equivalente a:

\[Renta\_empresas = Gcia_{hidrocarburos} - KTA_{hidrocarburífero} * TG_{referencia}\]

Donde:

  • \(KTA_{hidrocarburífero}\) = Stock de capital adelantado de empresas hidrocarburíferas
  • \(TG_{hidrocarburífera}\) = Tasa de ganancia de empresas hidrocarburíferas
  • \(TG_{referencia}\) = Tasa de ganancia de referencia
  • \(Gcia_{hidrocarburos}\) = Ganancia de empresas hidrocarburíferas

Renta por el diferencial de precios entre el mercado interno y las referencias internacionales

Renta apropiada mediante el abaratamiento en el consumo interno por efecto del diferencial de precios interno/externo, sobrevaluación de la moneda y retenciones a la exportación

Criterio de cómputo de JK (variable ‘renta_dif_precios’)

\[RDP= ProdInt * Pext * TCP - ProdInt * PMI * TCC\]

Donde:

  • \(RDP\) = Renta apropiada por efecto diferencial de precios interno/externo y sobrevaluación
  • \(MdoInt\) = Producción destinada al Mercado Interno: Producción - Exportaciones - Existencias (barriles de petróleo ó MMBTU)
  • \(Pext\) = Precio de referencia del mercado externo (USD)
  • \(PMI\) = Precio de venta del mercado interno (USD)
  • \(TCP\) = Tipo de Cambio de Paridad
  • \(TCC\) = Tipo de Cambio Comercial

Criterio de cómputo de JIC y cia (variable ‘renta_abaratamiento_sobrevaluacion’)

\[RDP = MdoInt * PMI * (\frac{TCP}{TCC} - 1)\]

Renta apropiada por sobrevaluación cambiaria

\[Rsobrevaluacion = Expo * Pext * (TCP - TCC)\]

Donde: * \(Rsobrevaluacion\) = Renta apropiada por exportaciones con tipo de cambio sobrevaluado * \(Expo\) = Exportaciones (barriles de petróleo ó MMBTU) * \(Pext\) = Precio de referencia del mercado externo (USD) * \(TCP\) = Tipo de Cambio de Paridad * \(TCC\) = Tipo de Cambio Comercial

Joining, by = "anio"

Renta apropiada por el Estado mediante impuestos específicos

Joining, by = "anio"
Joining, by = c("anio", "unidad")
`summarise()` has grouped output by 'anio'. You can override using the `.groups` argument.
Joining, by = c("anio", "unidad")

\[Rimp = RE + Reg\]

Donde:

  • \(Rimp\) = Renta apropiada por el Estado mediante impuestos específicos
  • \(RE\) = Retenciones
  • \(Reg\) = Regalias

Renta apropiada por consumidores y refinerías y procesadoras

Criterio de cómputo de Ramón (2019)

Refinerías y procesadoras

\[RR = (PI - PRMi) * CrudoP\]

  • \(RR\) = Renta apropiada por las Refinadoras
  • \(PI\) = promedio ponderado de Precios Internacionales
  • \(PRMi\) = Precio ponderado a Refinerías del Mercado Interno
  • \(CrudoP\) = barriles de Crudo Procesado por las refinadoras

Consumidores

\[RC = (PI - PRMi - MR) * CrudoP \]

  • \(RC\) = Renta apropiada por los Consumidores
  • \(MR\) = Margen de Refinerías

Esto resulta equivalente a plantear:

\[RC = PCMi * CrudoP\]

  • \(PCMi\) = Precio ponderado a Consumidores del Mercado Interno.

Renta Hidrocarburífera Total. En precios constantes, sobre Plusvalía Total y PBI

Existen dos caminos para llegar al monto total de renta de la tierra hidrocarburífera: uno es descontando la ganancia normal de las empresas a la plusvalía total del sector y el otro es por medio de la suma de mecanismos de apropiación.

\[Renta\_hidrocarburífera = PV_{hidrocarburífera} - Gcia\_Normal_{hidrocarburífera}\] Donde:

  • \(Gcia\_Normal_{hidrocarburífera}\) = Ganancia Normal del sector hidrocarburífero
  • \(PV_{hidrocarburífera}\) = Plusvalía del sector hidrocarburífero

\[Gcia\_Normal_{hidrocarburífera} = KTA_{hidrocarburífero} * TG_{referencia}\]

Donde:

  • \(KTA_{hidrocarburos}\) = Stock de capital adelantado del sector hidrocarburífero
  • \(TG_{referencia}\) = Tasa de ganancia normal de referencia.

En este caso, seleccionamos la tasa de ganancia del sector industrial como parámetro para diferenciar la renta de la ganancia. A su vez, para el capital total adelantado de las empresas hidrocarburíferas, seleccionamos unicamente el valor resultante de la estimación de la PPyE de Bolsar a partir del indice de flujo de pozos (variable “ppye_bolsar_flujo”), por lo que le faltan los inventarios y salarios adelantados.

El cálculo de renta total hidrocarburífera que se obtiene por medio de descontar la ganancia normal a la plusvalía total del sector, debe ser igual a la renta obtenida por medio de la agregación de los distintos mecanismos de apropiación. Es decir:

\[Renta\_hidrocarburífera = Renta\_diferencial\_precios + Renta\_sobrevaluación + Renta\_empresas + Impuestos\_netos\_específicos \] \[Impuestos\_netos\_específicos = Retenciones + Regalías - Subsidios\]

Renta total a partir de descuentos sobre el VBP

Joining, by = "anio"
Joining, by = "anio"

Renta total a partir de suma de mecanismos

Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
`mutate_all()` ignored the following grouping variables:
Column `anio`
Use `mutate_at(df, vars(-group_cols()), myoperation)` to silence the message.
`mutate_all()` ignored the following grouping variables:
Column `anio`
Use `mutate_at(df, vars(-group_cols()), myoperation)` to silence the message.
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Removed 18 rows containing missing values (position_stack).'big.mark' and 'decimal.mark' are both '.', which could be confusing
'big.mark' and 'decimal.mark' are both '.', which could be confusing

Costos

\[Q\_total = Q_{petróleo} + Q_{gas} \] Donde:

  • \(Q\_total\) = Cantidades producidas de petróleo y gas en Barriles Equivalentes de Petróleo
  • \(Q_{petróleo}\) = Cantidades producidas de petróleo crudo en barriles equivalentes de petróleo (BOE)
  • \(Q_{gas}\) = Cantidades producidas de gas natural en barriles equivalentes de petróleo (BOE)

\[ Costos\_totales = CI + MS + ConKfijo\]

Donde:

  • \(Costos\_totales\) = Costos totales hidrocarburíferos
  • \(CI\) = Consumo Intermedio, distintas estimaciones
  • \(MS\) = Masa Salarial, distintas estimaciones
  • \(ConKfijo\) = Consumo de Capital Fijo

\[Costos\_totales\_con\_Gcia = Costos\_totales + Gcia\_Normal_{hidrocarburífera} \] Donde:

  • \(Costos\_totales\_con\_Gcia\) = Costos totales hidrocarburíferos con ganancia normal
  • \(Gcia\_Normal_{hidrocarburífera}\) = Ganancia normal del sector hidrocarburífero

\[ Precio\_costo = \frac{Costos\_totales}{Q\_total} \] Donde: * \(Precio\_costo\) = Precio de costo en BOE

A partir de esto se puede calcular un costo recuperable del petróleo y del gas

\[Costo\_crudo = Q_{petróleo} * Precio\_costo\] \[Costo\_gas = Q_{gas} * Precio\_costo\]

\[Precio\_produccion = \frac{Costos\_totales\_con\_Gcia}{Q\_total}\]

\[Precio\_vta\_potencial = \frac{Q\_total*Pext_{petróleo} - Costos\_totales}{Q\_total} \]

Donde: * \(Precio\_produccion\)= Precio de produccion * \(Precio_vta_potencial\) = Precio de venta potencial * \(Pext_{petróleo}\) = Precio de exportación/referencia internacional del petróleo crudo

Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Joining, by = c("anio", "unidad")

Comparación con estimación de otros autores

'big.mark' and 'decimal.mark' are both '.', which could be confusing
LS0tDQp0aXRsZTogIlJlbnRhIGRlIGxhIHRpZXJyYSBoaWRyb2NhcmJ1csOtZmVyYSBlbiBBcmdlbnRpbmEgKDE5NjAgLSAyMDE4KSINCmF1dGhvcjoNCi0gYWZmaWxpYXRpb246IFVOR1MvQ09OSUNFVA0KICBuYW1lOiBNYXRlbyBTdXN0ZXIgeSBKdWFuIEtvcm5ibGlodHQNCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICB0b2M6IHllcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQotLS0NCg0KPGJyPg0KPGJyPg0KDQo8Y2VudGVyPiA8aDE+PC9oMT4gPC9jZW50ZXI+IA0KDQoNCg0KYGBge3J9DQojIHBhcmEgZ3VhcmRhciBnZ3Bsb3QgY29uIHRhbWHDsW8NCiMgZ2dzYXZlKCJmYWNldF93cmFwX2NoYXJ0LnBuZyIsIGZhY2V0X3dyYXBfY2hhcnQsIHdpZHRoID0gMTY4MC83MiwgaGVpZ2h0ID0gMTA1MC83MiwgZHBpID0gNzIpDQoNCmBgYA0KDQogIA0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMgbGlicmFyeSh4dGFibGUpICMgZWogeHRhYmxlKHRhYmxhKSBwYXJhIHBhc2FyIGEgbGF0ZXgNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpDQoNCmxpYnJhcnkocmVhZHhsKSANCiMgbGlicmFyeShyZWFkcikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KGZzKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGh1eHRhYmxlKSAjcmV2aXNhciBlc3RvIHBhcmEgZGFyIGZvcm1hdG8gYWwgZWplIFkNCiMgbGlicmFyeShQZXJmb3JtYW5jZUFuYWx5dGljcykNCmxpYnJhcnkoSG1pc2MpDQpsaWJyYXJ5KHpvbykNCg0KDQoNCm9wdGlvbnMoc2NpcGVuID0gOTk5OTk5OSkNCg0KIyBhZ3JlZ2FyIGxhYmVsIHBhcmEgdmFyaWFibGVzIGRlIGdyYWZpY29zIA0KI2ZhY2V0d3JhcCh+IGV4cGVyaW1lbnRveCwgbGFiZWxsZXIgPSBhc19sYWJlbGxlcihleHBfbmFtZXMpKSsgIA0KDQpgYGANCg0KIyBGdW5jaW9uZXMgZGUgY29udmVyc2nDs24gDQoNCiogW0NhbmFkYSDigJMgTmF0aW9uYWwgRW5lcmd5IEJvYXJkLiBFbmVyZ3kgQ29udmVyc2lvbiBUYWJsZXNdKGh0dHBzOi8vYXBwcy5jZXItcmVjLmdjLmNhL0NvbnZlcnNpb24vY29udmVyc2lvbi10YWJsZXMuYXNweD9Hb0NUZW1wbGF0ZUN1bHR1cmU9ZW4tQ0EjMi0zKQ0KKiBbQlBdKGh0dHBzOi8vd3d3LmJwLmNvbS9jb250ZW50L2RhbS9icC9idXNpbmVzcy1zaXRlcy9lbi9nbG9iYWwvY29ycG9yYXRlL3BkZnMvZW5lcmd5LWVjb25vbWljcy9zdGF0aXN0aWNhbC1yZXZpZXcvYnAtc3RhdHMtcmV2aWV3LTIwMTktYXBwcm94aW1hdGUtY29udmVyc2lvbi1mYWN0b3JzLnBkZikNCiogW0VJQV0oaHR0cHM6Ly93d3cuZWlhLmdvdi9raWRzL3doYXQtaXMtZW5lcmd5L2VuZXJneS1jYWxjdWxhdG9ycy5waHAjbmF0Z2FzY2FsYykNCg0KDQpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIEZ1bmNpb25lcyBkZSBjb252ZXJzacOzbiBwYXJhIGNydWRvDQojIyBNZXRybyBjdWJpY28gYSBiYXJyaWwgKF9wID0gcHJlY2lvLCBfcSA9IGNhbnRpZGFkKQ0KY29udmVyc29yX20zYmJsX3AgPC0gZnVuY3Rpb24oeCkge3ggLyA2LjI4OTh9DQpjb252ZXJzb3JfbTNiYmxfcSA8LSBmdW5jdGlvbih4KSB7eCAqIDYuMjg5OH0NCg0KIyBGdW5jaW9uZXMgZGUgY29udmVyc2nDs24gcGFyYSBnYXMNCiMjIFBpZXMgY8O6YmljbyBhIG1ldHJvIGPDumJpY28NCiMjIDFmdMKzPSAwLjAyODMxNjg1bcKzDQpjb252ZXJzb3JfZnQzbTNfcCA8LSBmdW5jdGlvbih4KSB7eCAvIDAuMDI4MzE2ODV9DQpjb252ZXJzb3JfZnQzbTNfcSA8LSBmdW5jdGlvbih4KSB7eCAqIDAuMDI4MzE2ODV9DQoNCiMjIFBpZSBjw7piaWNvIGEgTWlsbMOzbiBkZSBCVFUNCiMgMSBmdDMgPSAgMC4wMDEwMjggTU0gQlRVDQpjb252ZXJzb3JfZnQzTU1CVFVfcSA8LSBmdW5jdGlvbih4KSB7eCAqIDAuMDAxMDI4fQ0KY29udmVyc29yX2Z0M01NQlRVX3AgPC0gZnVuY3Rpb24oeCkge3ggLyAwLjAwMTAyOH0NCg0KIyMgTWlsbMOzbiBkZSBCVFUgYSBtZXRybyBjw7piaWNvDQojIyAxIE1NIEJ0dSA9ICAyNyw4IG0zIGRlIGdhcyAoSUFQRykgw7MgMjguMzI4NjEgbTMgKENhbmFkYSBFbmVyZ3kgUmVndWxhdG9yKSAgDQpjb252ZXJzb3JfTU1CVFVtM2dhc19wIDwtIGZ1bmN0aW9uKHgpIHt4IC8gMjguMzI4NjF9DQogIA0KIyMgbTMgYSAgTU1CVFUgZGUgZ2FzDQojIDEgbTMgPSAwLjAzNTMgTU0gQlRVICAoQ2FuYWRhIEVuZXJneSBSZWd1bGF0b3IpDQojIG90cmEgb3BjacOzbiAxIG0zID0gMzQuMTIxIE1NIEJUVSAgKEJQKQ0KY29udmVyc29yX20zTU1CVFVfcSA8LSBmdW5jdGlvbih4KXt4ICogMC4wMzUzfQ0KY29udmVyc29yX20zTU1CVFVfcCA8LSBmdW5jdGlvbih4KXt4IC8gMC4wMzUzfQ0KDQojIyBtMyBhICBNTUJUVSAoQWx0ZXJuYXRpdmEsIHJldmlzYXIpDQojIGNvbnZlcnNvcl9tM01NQlRVX3EgPC0gZnVuY3Rpb24oeCl7eCAqIDEvMjcuOH0NCiMgY29udmVyc29yX20zTU1CVFVfcCA8LSBmdW5jdGlvbih4KXt4IC8gMS8yNy44fQ0KDQojIyBDb252ZXJzacOzbiBhIEJFUCBkZXNkZSBkaXN0aW50YXMgbWVkaWRhcw0KY29udmVyc29yX20zYmVwX3EgPC0gZnVuY3Rpb24oeCkge3ggKiA1ODgzfQ0KY29udmVyc29yX01NQlRVYmVwX3EgPC0gZnVuY3Rpb24oeCkge3ggKiAwLjE3MjQ1NDk2fSAjIEJQDQpjb252ZXJzb3JfTU1CVFViZXBfcCA8LSBmdW5jdGlvbih4KSB7eCAvIDAuMTcyNDU0OTZ9DQpjb252ZXJzb3JfYmVwTU1CVFVfcCA8LSBmdW5jdGlvbih4KSB7eCAvIDUuNzk4NjE1fQ0KYGBgDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMgT3RyYXMgZnVuY2lvbmVzDQpjYW1iaW9fcG9yY2VudHVhbCA8LSBmdW5jdGlvbih4KSB7eC9sYWcoeCkgLSAxfQ0KDQpnZW5lcmFyX2luZGljZSA8LSAgZnVuY3Rpb24oc2VyaWUsZmVjaGEsIGZlY2hhX2Jhc2Upew0KICB2YWxvcl9iYXNlIDwtIHNlcmllW3doaWNoKGZlY2hhPT1mZWNoYV9iYXNlKV0NCiAgaWZfZWxzZShzZXJpZSA9PSAwLCAwLCBzZXJpZS92YWxvcl9iYXNlKQ0KfQ0KDQoNCg0KdmFyaWFjaW9uX2ludGVyYW51YWwgPC0gZnVuY3Rpb24oeCkge3ggIC0gbGFnKHgpfQ0KDQp0YXNhX2NyZWNpbWllbnRvIDwtIGZ1bmN0aW9uKHgpIHsoeCAgLSBsYWcoeCkpL2xhZyh4KX0NCg0KDQpnZW5lcmFyX2luZGljZSA8LSAgZnVuY3Rpb24oc2VyaWUsZmVjaGEsIGZlY2hhX2Jhc2Upew0KICB2YWxvcl9iYXNlIDwtIHNlcmllW3doaWNoKGZlY2hhPT1mZWNoYV9iYXNlKV0NCiAgKHNlcmllL3ZhbG9yX2Jhc2UpDQp9DQoNCg0KDQojIFRhYmxhIHBhcmEgY29udmVydGlyIGxvcyBjYW1iaW9zIGRlIG1vbmVkYQ0KY29udmVyc29yX3Blc29zIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvcGFzZSBkZSBtb25lZGEueGxzeCIpICU+JSANCiAgIyBtdXRhdGUoIm0kbiIgPSBhcy5kb3VibGUoY29udmVyc29yX3Blc29zJGBtJG5gKSkgJT4lIA0KICBtdXRhdGVfYWxsKC4sIGFzLmRvdWJsZSkgJT4lIA0KICBtdXRhdGUobW9uZWRhID0gYygibW9uZWRhIG5hY2lvbmFsIiwgInBlc29zIGxleSIsICJwZXNvIGFyZ2VudGlubyIsICJhdXN0cmFsIiwgInBlc29zIikpICU+JSANCiAgZmlsdGVyKG1vbmVkYSA9PSAicGVzb3MiKQ0KDQpgYGANCg0KDQoNCg0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQoNCiMgRGF0b3MgYXV4aWxpYXJlcw0KIyNSZXZpc3RhIGRlIFBvbMOtdGljYSBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnw61hDQojIyBHQVMNCiNwcmVjaW8gdHJhbnNmZXJlbmNpYSwgcmVnYWxpYXMsIGNvbXBlbnNhY2lvbmVzLCBldGMgYSBub3ZpZW1icmUgZGUgY2FkYSBhw7FvDQpjdWFkcm9fNC4xIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBnYXMgbmF0dXJhbCB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OC54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gMSkNCg0KI3ByZWNpbyBib2xpdmlhIHZzIHByZWNpb3MgaW50ZXJub3MNCmN1YWRyb180LjMgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIGdhcyBuYXR1cmFsIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg4Lnhsc3giLCANCiAgICBza2lwID0gMSwgc2hlZXQgPSAzKSAlPiUNCiAgcmVuYW1lKHVuaWRhZF9nYXMgPSAidW5pZGFkIGdhcyIpICU+JSANCiAgbXV0YXRlKHVuaWRhZF9nYXMgPSAicGVzb3MgZGUgMTk3MC8xMDAwIG0zIiApDQoNCiNwcmVjaW8gYWRxdWlzaWNpw7NuIGRlbCBFc3RhZG8geSB0YXJpZmEgbWVkaWEgZGUgZ2FzIGRpc3RyaWJ1aWRvDQpjdWFkcm9fNC40IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBnYXMgbmF0dXJhbCB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OC54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gNCkNCmBgYA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIyBDUlVETw0KDQojIFByZWNpb3MgcG9yIGN1ZW5jYQ0KY3VhZHJvXzIuMiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgcGV0cm9sZW8gY3J1ZG8geSBkZXJpdmFkb3MgMTk3MCAtIDE5ODkueGxzeCIsIA0KICAgIHNraXAgPSAwLCBzaGVldCA9IDIpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJwZXNvcyBkZSAxOTcwIikNCg0KI2V2b2x1Y2nDs24gZGUgcHJlY2lvcyBwb3IgY3VlbmNpYSAoaW5kaWNlcyAxOTcwID0gMTAwKQ0KY3VhZHJvXzIuMyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgcGV0cm9sZW8gY3J1ZG8geSBkZXJpdmFkb3MgMTk3MCAtIDE5ODkueGxzeCIsIA0KICAgIHNraXAgPSAwLCBzaGVldCA9IDMpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiLi4uMSIpDQoNCg0KIyBwcmVjaW8gcHJvbWVkaW8gcGFnYWRvIGEgY29udHJhdGlzdGFzIGVuIHBlc29zIHkgZG9sYXJlcw0KY3VhZHJvXzIuNSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgcGV0cm9sZW8gY3J1ZG8geSBkZXJpdmFkb3MgMTk3MCAtIDE5ODkueGxzeCIsIA0KICAgIHNraXAgPSAxLCBzaGVldCA9IDUpDQoNCiMgcHJlY2lvcyBwYWdhZG9zIGEgY29udHJhdGlzdGFzIHZzIGNvYnJhZG9zIHBvciByZWZpbmFkb3JhcyBwcml2YWRhcyAocHJlY2lvIGNydWRvIG5ldXF1aW5hKQ0KY3VhZHJvXzIuNiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgcGV0cm9sZW8gY3J1ZG8geSBkZXJpdmFkb3MgMTk3MCAtIDE5ODkueGxzeCIsIA0KICAgIHNraXAgPSAxLCBzaGVldCA9IDYpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJwZXNvc19kZV8xOTcwX20zIikNCg0KIyB2YWxvcmVzIHVuaXRhcmlvcyBkZWwgcHJvZHVjdG8gY29tcHVlc3RvIGEgbml2ZWwgcHJvZHVjdG9yZXMgeSBjb25zdW1pZG9yZXMNCmN1YWRyb18yLjcgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIHBldHJvbGVvIGNydWRvIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg5Lnhsc3giLCANCiAgICBza2lwID0gMSwgc2hlZXQgPSA3KQ0KDQpgYGANCiANCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyMjIFRDUCANCnRjcF9hbnVhbCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9UQ1AvdGNwX2FudWFsLnhsc3giLCANCiAgICBjb2xfdHlwZXMgPSBjKCJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIpKSAlPiUgDQogIHJlbmFtZShhbmlvID0gZmVjaGEpDQoNCnRjcF9hbnVhbF9iIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL1RDUC90Y2NfdGNwX2hpc3Rvcmljby54bHN4IikgJT4lIA0KICByZW5hbWUodGNjID0gIGBUQ0MgZXhwb3J0YWNpb25lc2AsIHNvYnJldmFsdWFjaW9uID0gYFNvYnJldmFsdWFjacOzbiAoVENQLyBUQ0MpIDE5NTItMTk3Mj0xYCwNCiAgICAgICAgIHRjcCA9ICJUQ1AiKSAlPiUgDQogIG11dGF0ZShhbmlvID0gY2FzZV93aGVuKGFuaW8gPT0gNDMzMTMgfiAyMDE4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gYW5pbykpDQoNCiMgdGNfMzUwMCA8LSByZWFkX2V4Y2VsKCIvQXJjaGl2b3MvRGF0b3MvVENQL2NvbTM1MDAueGxzIiwgc2tpcCA9IDMsIHNoZWV0ID0gMSkgJT4lIA0KIyAgIHNlbGVjdCgtIi4uLjMiKSAlPiUgDQojICAgbXV0YXRlKGFuaW8gPSB5ZWFyKEZlY2hhKSkgJT4lIA0KIyAgIGdyb3VwX2J5KGFuaW8pICU+JSANCiMgICBzdW1tYXJpc2UodGNjX2F2ZyA9IG1lYW4oYFRpcG8gZGUgQ2FtYmlvIGRlIFJlZmVyZW5jaWEgLSBlbiBQZXNvcyAtIHBvciBEw7NsYXJgKSkNCiMgd3JpdGUuY3N2KHRjXzM1MDAsICJyZXN1bHRhZG9zL2F1eGlsaWFyZXMvdGNfMzUwMC5jc3YiKQ0KDQp0Y2NfZGljXzYzIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL1RDUC90Y2NfZGljXzYzLnhsc3giKQ0KDQp0Y2NfbW9uZWRhX29yaWdpbmFsIDwtICB0Y2NfZGljXzYzICU+JSANCiAgc2VsZWN0KC11c2RfZGljKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiAlPiUgc2VsZWN0KGFuaW8sIHRjYyApKSAlPiUgDQogIG11dGF0ZShtb25lZGEgPSBjYXNlX3doZW4oYW5pbyA9PSAxOTg0IH4gIiRhcmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBtb25lZGEpLA0KICAgICAgICAgIHRjY19tb25lZGEgPSBjYXNlX3doZW4oICNob21vZ2VuaXphbW9zIGxvcyBjYW1iaW9zIGRlIG1vbmVkYQ0KICAgICAgICAgICAgICAgICBtb25lZGEgPT0gIm0kbiIgfiB0Y2MqY29udmVyc29yX3Blc29zJGBtJG5gICwNCiAgICAgICAgICAgICAgICAgbW9uZWRhID09ICIkbGV5IiB+IHRjYypjb252ZXJzb3JfcGVzb3MkYCRMZXlgLCANCiAgICAgICAgICAgICAgICAgbW9uZWRhID09ICIkYXJnIiB+IHRjYypjb252ZXJzb3JfcGVzb3MkYCRhYCwgDQogICAgICAgICAgICAgICAgIG1vbmVkYSA9PSAiQSIgfiB0Y2MqY29udmVyc29yX3Blc29zJEEsDQogICAgICAgICAgICAgICAgIFQgfiB0Y2MpICkNCnRjY19tb25lZGFfb3JpZ2luYWwgIA0KYGBgDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMjIElQQw0KaXBjIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL2luZGljZXMvaXBjX21lbnN1YWxfMTk2M18yMDE4Lnhsc3giKSAlPiUgDQogIG11dGF0ZShhbmlvID0gem9vOjpuYS5sb2NmKGFuaW8pKSAlPiUgDQogIHJlbmFtZShpcGNfMDcwMyA9IGBCYXNlIDcvMjAwMyA9IDFgKSAlPiUgDQogIG11dGF0ZShmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHBhc3RlKGFuaW8sIG1lcywgc2VwID0gIi0iKSwgb3JkZXJzID0gInltIikpKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgYW5pbywgbWVzICwgZXZlcnl0aGluZyguKSkNCg0KI2VzdGUgZXN0w6EgbWFsICANCiMgaXBjX3ZhcmlhY2lvbiA8LSAgaXBjICAlPiUgDQojICAgZmlsdGVyKG1lcyA9PSAxKSAlPiUgDQojICAgbXV0YXRlKGlwY192YXIgPSBjYW1iaW9fcG9yY2VudHVhbChpcGNfMDcwMyksDQojICAgICAgICAgIGlwY192YXI9IGNhc2Vfd2hlbihpcy5uYShpcGNfdmFyKSB+IDEsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gaXBjX3ZhciksDQojICAgICAgICAgICBpcGNfMDE2MiA9IGNhc2Vfd2hlbihhbmlvID09IDE5NjIgfiAxKSwNCiMgICAgICAgICAgaXBjXzAxNjIgPSBsYWcoaXBjXzAxNjIpK2xhZyhpcGNfMDE2MikqIGlwY192YXIpDQojICAgICAgICAgIA0KICAgICAgICAgIyBpcGNfMDE2MiA9IGxhZyhpcGNfMDE2MikgKyAobGFnKGlwY18wMTYyKSogaXBjX3ZhcikpDQogICAgICAgICAjIGlwY18wMTYyID0gY2FzZV93aGVuKCBpcy5uYShpcGNfMDE2MikgfiBsYWcoaXBjXzAxNjIpICsgbGFnKGlwY18wMTYyKSppcGNfdmFyICkpDQoNCg0KaXBjX3Byb21lZGlvIDwtIGlwYyAlPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UoaXBjXzAzID0gbWVhbihpcGNfMDcwMykpICU+JSANCiAgbXV0YXRlKGZlY2hhID0gYXMuRGF0ZShwYXJzZV9kYXRlX3RpbWUoYW5pbyAsIG9yZGVycyA9ICJ5IikpLCANCiAgICAgICAgIGlwY183MCA9IGdlbmVyYXJfaW5kaWNlKHNlcmllID0gaXBjXzAzLCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGE9IGZlY2hhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYV9iYXNlID0gIjE5NzAtMDEtMDEiKSwNCiAgICAgICAgIGlwY18xOCA9IGdlbmVyYXJfaW5kaWNlKHNlcmllID0gaXBjXzAzLCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGE9IGZlY2hhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYV9iYXNlID0gIjIwMTgtMDEtMDEiKSkgJT4lIA0KICBzZWxlY3QoZmVjaGEsIGV2ZXJ5dGhpbmcoLikpDQoNCndyaXRlLmNzdihpcGNfcHJvbWVkaW8sIGZpbGUgPSAiQzovQXJjaGl2b3MvRGF0b3MvaW5kaWNlcy9pcGNfcHJvbWVkaW8uY3N2IikNCg0KIyBpcGNfNzAgPC0gaXBjX3ZhcmlhY2lvbiAlPiUgDQojICAgc2VsZWN0KGZlY2hhLCBpcGNfMDE3MCkgJT4lIA0KIyAgIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIA0KIyAgICAgICAgICAgICAgIHNlbGVjdChmZWNoYSwgaXBjXzcwKSkNCg0KIyBJUElNIGJhc2UgMTk5MyA9IDEwMA0KIyDDjW5kaWNlIGRlIHByZWNpb3MgaW50ZXJub3MgYWwgcG9yIG1heW9yIChJUElNKQ0KIyDDjW5kaWNlIGRlIHByZWNpb3MgaW50ZXJub3MgYsOhc2ljb3MgYWwgcG9yIG1heW9yIChJUElCKQ0KIyDDjW5kaWNlIGRlIHByZWNpb3MgYsOhc2ljb3MgZGVsIHByb2R1Y3RvciAoSVBQKQ0Kc2lwbV9zZXJpZTU2Xzk1IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0lOREVDL0lQSU0vc2lwbS1zZXJpZTU2LTk1LnhscyIsDQogICAgc2tpcCA9IDYpICU+JSANCiAgcmVuYW1lKGFuaW8gPSBtZXMsDQogICAgICAgICBpcGltX25pdmVsX2dyYWwgPSBnZW5lcmFsLi4uMiAsDQogICAgICAgICBpcGltX25pdmVsX25hYyA9IG5hY2lvbmFsZXMuLi4zLA0KICAgICAgICAgaXBpbV9uaXZlbF9pbXBvID0gSW1wb3J0YWRvcywNCiAgICAgICAgIGlwaWJfbml2ZWxfZ3JhbCA9IGdlbmVyYWwuLi41ICwNCiAgICAgICAgIGlwaWJfbml2ZWxfbmFjID0gbmFjaW9uYWxlcy4uLjYsDQogICAgICAgICBpcGliX25pdmVsX2ltcG8gPSBpbXBvcnRhZG9zLA0KICAgICAgICAgaXBwX25pdmVsX2dyYWwgPSBnZW5lcmFsLi4uOCkgJT4lIA0KICBmaWx0ZXIoZ3JlcGwoICIxOSIsIGFuaW8pKSAlPiUgDQogIG11dGF0ZShhbmlvID0gYXMuZG91YmxlKGFuaW8pKQ0KDQppcGltX2Jhc2U5NCA8LSBzaXBtX3NlcmllNTZfOTUgJT4lIG11dGF0ZShpcGltX25pdmVsX2dyYWxfOTQgPSBnZW5lcmFyX2luZGljZShpcGltX25pdmVsX2dyYWwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGEgPSBhbmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9IDE5OTQpKSAlPiUgDQogIHNlbGVjdChhbmlvLCBpcGltX25pdmVsX2dyYWwsIGlwaW1fbml2ZWxfZ3JhbF85NCkNCg0KIyBHYW5hbmNpYSB5IHBiaSBwZXNvcyBjb3JyaWVudGVzIChmdWVudGU6IEpJQy9FTSBjb250aW51YWNpb24gSklDKQ0KZ2FuYW5jaWFfeV9wYmkgPC0gcmVhZF9leGNlbCgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvZ2FuYW5jaWEgeSBwYmkueGxzeCIpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBjb3JyaWVudGVzIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pKQ0KDQpgYGANCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyBFc3RpbWFjaW9uIGRlIG90cm9zIGF1dG9yZXMNCiMgKipFc3RpbWFjacOzbiBKSyoqDQpyZW50YV9oaWRyb2NhcmJ1cm9zX2prIDwtIHJlYWRfZXhjZWwoIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL3JlbnRhX2hpZHJvY2FyYnVyb3NfamsueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JSANCiAgZmlsdGVyKGluZGljZV90aWVtcG8gPD0gMjAxOSkgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkgJT4lIA0KICByZW5hbWUocHJlY2lvX21lX2dhcyA9IGBHYXMgbmF0dXJhbCBtZXJjYWRvIGV4dGVybm9gLA0KICAgICAgICAgcHJlY2lvX21pX2dhcyA9IGBwcmVjaW8gaW50ZXJubyBnYXMgbmF0dXJhbF9wZXNvc2AsDQogICAgICAgICBwcmVjaW9fbWVfY3J1ZG8gPSBgUHJlY2lvIGNydWRvIG1lcmNhZG8gZXh0ZXJub2AsDQogICAgICAgICBwcmVjaW9fbWlfY3J1ZG8gPSBgUHJlY2lvIGNydWRvIG1lcmNhZG8gaW50ZXJub2AsDQogICAgICAgICBwcmVjaW9fYm9saXZpYV9nYXNfdXNkID0gYEdhcyBOYXR1cmFsLiBQcmVjaW8gVmVudGEgQm9saXZpYSBhIEFyZ2VudGluYS4uLjI0YCwgDQogICAgICAgICBwcmVjaW9fYm9saXZpYV9nYXNfcGVzb3MgPSBgR2FzIE5hdHVyYWwuIFByZWNpbyBWZW50YSBCb2xpdmlhIGEgQXJnZW50aW5hLi4uMjVgLA0KICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvX2NydWRvID1gUmVudGEgcG9yIHZlbnRhIGNydWRvIGVuIGVsIG1lcmNhZG8gaW50ZXJubyBwb3IgZGViYWpvIC8gYXJyaWJhIHByZWNpbyBpbnRlcm5hY2lvbmFsYCwNCiAgICAgICAgIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb19nYXMgPSAnUmVudGEgcG9yIHZlbnRhIGdhcyBlbiBlbCBtZXJjYWRvIGludGVybm8gcG9yIGRlYmFqbyAvIGFycmliYSBwcmVjaW8gaW50ZXJuYWNpb25hbCcsDQogICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyA9ICdSZW50YSBjcnVkbyBwb3IgZXhwb3J0YWNpb25lcyBhIHBlc28gc29icmV2YWx1YWRvJywNCiAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcyA9ICdSZW50YSBnYXMgcG9yIGV4cG9ydGFjaW9uZXMnLA0KICAgICAgICAgcmV0ZW5jaW9uZXMgPSAiUmV0ZW5jaW9uZXMiLA0KICAgICAgICAgcmVnYWxpYXMgPSBgUmVnYWxpYXMgdG90YWxgLA0KICAgICAgICAgcmVudGFfdG90YWwgPSAnU1VNQSByZW50YSBvdHJvcyAoc2luIGltcG9ydGFjaW9uZXMgbmkgcmV0ZW5jaW9uZXMpJykgJT4lIA0KICBtdXRhdGUodW5pZGFkX2dhcyA9ICJNTUJUVSIsDQogICAgICAgICB1bmlkYWRfY3J1ZG8gPSAiQmFycmlsZXMiLA0KICAgICAgICAgdW5pZGFkX3JlbnRhID0gIlBlc29zIGNvcnJpZW50ZXMiKSAlPiUgDQogIHNlbGVjdChhbmlvID0gaW5kaWNlX3RpZW1wbywgdW5pZGFkX2dhcywgdW5pZGFkX2NydWRvLCB1bmlkYWRfcmVudGEsDQogICAgICAgICBwcm9kX3BldGNydSwgZXhwb19jcnVkbywgY3J1ZG9faW50ZXJubywNCiAgICAgICAgIHByb2RfZ2FzbmF0LCBleHBvX2dhcywgZ2FzX2ludGVybm8sDQogICAgICAgICBwcmVjaW9fbWVfZ2FzICwgcHJlY2lvX21pX2dhcyAsIHByZWNpb19tZV9jcnVkbywgcHJlY2lvX21pX2NydWRvLCANCiAgICAgICAgIHByZWNpb19ib2xpdmlhX2dhc191c2QgLCAgcHJlY2lvX2JvbGl2aWFfZ2FzX3Blc29zICwgDQogICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9fY3J1ZG8gLCByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9fZ2FzICwNCiAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvICwgcmVudGFfc29icmV2YWx1YWNpb25fZ2FzICwNCiAgICAgICAgIHJldGVuY2lvbmVzLCByZWdhbGlhcywgDQogICAgICAgICBUQ0MsIFRDUCwgDQogICAgICAgICByZW50YV90b3RhbCkgJT4lDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByb2RfcGV0Y3J1IiwgImV4cG9fY3J1ZG8iLCAiY3J1ZG9faW50ZXJubyIpLCANCiAgICAgICAgICAgIC5mdW5zID0gY29udmVyc29yX20zYmJsX3EpICU+JSANCiAgbXV0YXRlX2F0KC52YXJzID0gYygicHJlY2lvX21pX2NydWRvIiwgInByZWNpb19tZV9jcnVkbyIpLA0KICAgICAgICAgICAgLmZ1bnMgPSBjb252ZXJzb3JfbTNiYmxfcCkgJT4lIA0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcm9kX2dhc25hdCIsICJleHBvX2dhcyIsICJnYXNfaW50ZXJubyIpLA0KICAgICAgICAgICAgLmZ1bnMgPSBjb252ZXJzb3JfbTNNTUJUVV9xKSAlPiUgDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByZWNpb19taV9nYXMiLCAicHJlY2lvX2JvbGl2aWFfZ2FzX3Blc29zIiksDQogICAgICAgICAgICAuZnVucyA9IGNvbnZlcnNvcl9tM01NQlRVX3ApDQoNCiAgDQpyZW50YV9wcmVjaW9fZXhwb19jcnVkb19qayA8LSByZW50YV9oaWRyb2NhcmJ1cm9zX2prICU+JSANCiAgc2VsZWN0KGFuaW8sIHByb2RfcGV0Y3J1LCBleHBvX2NydWRvLCBjcnVkb19pbnRlcm5vLCANCiAgICAgICAgIHByZWNpb19taV9jcnVkbywgcHJlY2lvX21lX2NydWRvLCBUQ0MsIFRDUCwgDQogICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9fY3J1ZG8sIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvICkNCg0KDQpyZW50YV9wcmVjaW9fZXhwb19nYXNfamsgPC0gcmVudGFfaGlkcm9jYXJidXJvc19qayAlPiUgDQogIHNlbGVjdChhbmlvLCBwcm9kX2dhc25hdCwgZXhwb19nYXMsIGdhc19pbnRlcm5vLCANCiAgICAgICAgIHByZWNpb19taV9nYXMsIHByZWNpb19ib2xpdmlhX2dhc19wZXNvcywgVENDLCBUQ1AsIA0KICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvX2dhcywgcmVudGFfc29icmV2YWx1YWNpb25fZ2FzICkNCg0KDQojRXN0aW1hY2nDs24gQmlsbCB5IEZhcmZhcm8gUnVpeg0KcmVudGFfaGlkcm9jYXJidXJvc19mciA8LSByZWFkX2V4Y2VsKCIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9yZW50YV9oaWRyb2NhcmJ1cm9zX0ZSLnhsc3giICkgJT4lDQogIHNlbGVjdCgtdW5pZGFkKSAlPiUgDQogIHJlbmFtZShyZWdhbGlhcyA9ICJSZWdhbMOtYXMiLA0KICAgICAgICAgcmV0ZW5jaW9uZXMgPSBSZXRlbmNpb25lcywNCiAgICAgICAgIGV4cG9fdGMgPSAiTWVkaWFudGUgc29icmV2YWx1YWNpw7NuIHBhcmEgZXhwb3J0IiwNCiAgICAgICAgIGRpZl9wcmVjaW9zID0gIk1lZGlhbnRlIGRpZmVyZW5jaWEgcHJlY2lvIGludGVybm8gY29uIGludGVybmFjIikgJT4lDQogIGdyb3VwX2J5KGFuaW8gLCBpcGNfMDgpICU+JSANCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7eCAvIDEwXjN9KSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUNCiAgbXV0YXRlKHJlZ2FsaWFzID1yZWdhbGlhcyAqIGlwY18wOCAvaXBjXzE4LA0KICAgICAgICAgcmV0ZW5jaW9uZXMgPXJldGVuY2lvbmVzICogaXBjXzA4IC9pcGNfMTgsDQogICAgICAgICBleHBvX3RjID1leHBvX3RjICogaXBjXzA4IC9pcGNfMTgsDQogICAgICAgICBkaWZfcHJlY2lvcyA9ZGlmX3ByZWNpb3MgKiBpcGNfMDggL2lwY18xOCwNCiAgICAgICAgIHJlbnRhX3RvdGFsID0gcmVnYWxpYXMrIHJldGVuY2lvbmVzKyBleHBvX3RjKyBkaWZfcHJlY2lvcywNCiAgICAgICAgIHVuaWRhZCA9ICJtaWxsb25lcyBkZSBwZXNvcyAyMDE4IikgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoLWlwY18wOCkgDQpyZW50YV9oaWRyb2NhcmJ1cm9zX2ZyDQoNCiNvdHJvcyBhdXRvcmVzDQpyZW50YV9hdXRvcmVzIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gY2FsY3VsbyByZW50YSBvdHJvcy9yZW50YV9hdXRvcmVzLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkNCg0KDQpgYGANCg0KDQojIFZhcmlhYmxlcw0KDQojIyBQcm9kdWNjacOzbg0KDQpGdWVudGVzOiANCg0KKiBbTWluaXN0ZXJpbyBkZSBIYWNpZW5kYSwgSW5mb3JtZXMNClNlY3RvcmlhbGVzXShodHRwczovL3d3dy5hcmdlbnRpbmEuZ29iLmFyL2Vjb25vbWlhL3BvbGl0aWNhZWNvbm9taWNhL3JlZ2lvbmFseXNlY3RvcmlhbC9pbmZvcm1lc3Byb2R1Y3Rpdm9zKSAoMTk5OC1ob3kpLiANCiogW1NlY3JldGFyw61hIGRlIEVuZXJnw61hIC0gUmVnYWxpYXNdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9yZWdhbGlhcy1kZS1wZXRyb2xlby1jcnVkby1nYXMtbmF0dXJhbC1nbHAtZ2Fzb2xpbmEteS1jb25kZW5zYWRvKSAoMTk5OC1ob3kpDQoqIFtTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSAtIFNFU0NPIERvd25zdHJlYW1dKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9wcm9kdWNjaW9uLWRlLXBldHJvbGVvLXktZ2FzLXRhYmxhcy1kaW5hbWljYXMpKDE5OTMtaG95KQ0KKiBbQW51YXJpbyBkZSBjb21idXN0aWJsZXNdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9hbnVhcmlvcy1kZS1jb21idXN0aWJsZXMtMTk1MC0xOTk5KSAoMTkxMS0xOTkyKQ0KKiBLb3p1bGogeSBQaXN0b25lc2kuIFJldmlzdGEgIGRlbCBJbnN0aXR1dG8gZGUgRWNvbm9tw61hIEVuZXJnw6l0aWNhIChJREVFKSAtIEZ1bmRhY2nDs24gQmFyaWxvY2hlICAoMTk3MCAtIDE5ODgpDQoqIFtFSUFdKGh0dHBzOi8vd3d3LmVpYS5nb3YvaW50ZXJuYXRpb25hbC9kYXRhL2NvdW50cnkvQVJHL3BldHJvbGV1bS1hbmQtb3RoZXItbGlxdWlkcy9hbm51YWwtcGV0cm9sZXVtLWFuZC1vdGhlci1saXF1aWRzLXByb2R1Y3Rpb24/cGQ9NSZwPTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDB2ZyZ1PTAmZj1BJnY9bWFwYnViYmxlJmE9LSZpPW5vbmUmdm89dmFsdWUmJnQ9QyZnPW5vbmUmbD0yNDktLTYmcz05NDY5NDQwMDAwMCZlPTE1NDYzMDA4MDAwMDApICgxOTgwIC0gMjAxOSkNCg0KIyMjIFByb2R1Y2Npw7NuIGRlIENydWRvDQoNCioqcG9uZXIgZW4gY3VhbnRvIG5vIGNvaW5jaWRlLCBjdWFudG8gZXN0YSBwb3IgZW5jaW1hIG8gcG9yIGRlYmFqbywgYnJlY2hhLCBleHBsaWNhciBlbiBxdcOpIGHDsW8gc2UgaGFjZSBlbCBlbXBhbG1lIGVuIGxvcyBwcmVjaW9zICoqDQoNCkxhIHByb2R1Y2Npw7NuIGRlIHBldHLDs2xlbyBjcnVkbyBkZSBsYXJnbyBwbGF6byBwcm92aWVuZSBkZWwgQW51YXJpbyBkZSBDb21idXN0aWJsZXMsIGRlIGxhIGN1YWwgY29udGFtb3MgZGF0b3MgZGVzZGUgMTkxMSBoYXN0YSAxOTkyLiBTdXMgdmFsb3JlcyBwYXJhIGVsIHBlcsOtb2RvIDE5ODAtMTk5MiBjb2luY2lkZW4gY29uIGxvcyBkZSBFSUEsIHBvciBsbyBjdWFsIHB1ZWRlbiB1c2Fyc2UgY29tbyBmdWVudGVzIGFsdGVybmF0aXZhcy4gQXNpbWlzbW8sIGxhIGV2b2x1Y2nDs24gZGUgU0VTQ08gZXMgc2ltaWxhciBhIGxhIGRlIEVJQSwgc2Fsdm8gcG9yIHBlcXVlw7FhcyBkaXZlcmdlbmNpYXMgZW50cmUgMjAwOCB5IDIwMTMuIExhIHNlcmllIGRlIFJlZ2Fsw61hcyBwcmVzZW50YSB1biBuaXZlbCBtZW5vciBxdWUgbGFzIGFudGVyaW9yZXMgZGViaWRvIGEgbGFzIGRlZHVjY2lvbmVzIGRlIHByb2R1Y2Npw7NuIHF1ZSByZWFsaXphbiBsYXMgZW1wcmVzYXMgcGFyYSBwYWdhciB1biBtZW5vciBuaXZlbCBkZSBSZWdhbMOtYXMgaGFjaWEgbGFzIHByb3ZpbmNpYXMgZG9uZGUgcmVhbGl6YW4gbGEgcHJvZHVjY2nDs24uIFBvciDDumx0aW1vLCBsYSBzZXJpZSBkZWwgTWluaXN0ZXJpbyBkZSBFY29ub23DrWEgY29pbmNpZGUgY29uIFJlZ2Fsw61hcyBlbiBzdXMgcHJpbWVyb3MgYcOxb3MsIGx1ZWdvIHByZXNlbnRhIHVuIG5pdmVsIGludGVybWVkaW8gZW50cmUgUmVnYWzDrWFzIHkgU0VTQ08geSBhIHBhcnRpciBkZSAyMDA5IHRvbWEgYSBTRVNDTyBjb21vIGZ1ZW50ZS4gU2Fsdm8gZWwgQW51YXJpbyBkZSBDb21idXN0aWJsZXMsIGVsIHJlc3RvIGRlIGxhcyBzZXJpZXMgcHJlc2VudGFuIGRhdG9zIGhhc3RhIGxvcyDDumx0aW1vcyBhw7Fvcy4gUG9yIGxvIHRhbnRvLCBlbCBjcml0ZXJpbyBkZSBzZWxlY2Npw7NuIHBhcmEgbGEgc2VyaWUgZGUgcHJvZHVjY2nDs24gY29uIGxhIHF1ZSBzZSByZWFsaXphcsOhbiBsb3MgY8OhbGN1bG9zIGVzIGVsIHNpZ3VpZW50ZToNCg0KKiBDcml0ZXJpbyBkZSBjw7NtcHV0byBwYXJhIHByb2R1Y2ljw7NuIGRlIGNydWRvOiANCiAgKyAxOTExIGEgMTk5MjogQW51YXJpbyBkZSBjb21idXN0aWJsZXMgDQogICsgMTk5MyAtIGFjdHVhbGlkYWQ6IFNFU0NPIERvd25zdHJlYW0NCg0KDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQojIFBST0NFU0FSIEVTVEEgQkFTRQ0KbWVjb25faGlkcm9jYXJidXJvc19kZiA8LSAgcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvTWVjb24vaGlkcm9jYXJidXJvcy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKGluZGljZV90aWVtcG8gPSBjb2xfZGF0ZShmb3JtYXQgPSAiJWQvJW0vJVkiKSksIA0KICAgIGxvY2FsZSA9IGxvY2FsZShlbmNvZGluZyA9ICJJU08tODg1OS0xIikpDQp1bmlxdWUobWVjb25faGlkcm9jYXJidXJvc19kZiRpbmRpY2Fkb3IpDQoNCmBgYA0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNBbnVhcmlvIGRlIGNvbWJ1c3RpYmxlcw0KcHJvZF9hbnVhcmlvIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUHJvZHVjY2lvbi9Qcm9kdWNjaW9uX0Rlc2RlXzE5MTEgLSBjb3BpYS54bHMiKSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDkU8iLCBjcnVkb19hbnVhcmlvX01tMyA9ICJQRVRST0xFTyAoTW0zKSIsIA0KICBnYXNfaCA9IGBHQVMgTkFUVVJBTCAoTWlsbC4gbTMpYCwgY2FyYm9uX2ggPSBgQ0FSQk9OIChNVG4pICgqKWApICU+JSANCiAgbXV0YXRlKGdhc19hbnVhcmlvX01NbTMgICA9IGFzLmRvdWJsZShnYXNfaCksIA0KICAgICAgICAgY2FyYm9uX2FudWFyaW9fTXRuICAgPSBhcy5kb3VibGUoY2FyYm9uX2gpLA0KICAgICAgICAgY3J1ZG9fYW51YXJpbyA9IGNydWRvX2FudWFyaW9fTW0zICogMTAwMCkgJT4lIA0KICBzZWxlY3QoYW5pbywgY3J1ZG9fYW51YXJpbywgZ2FzX2FudWFyaW9fTU1tMywgY2FyYm9uX2FudWFyaW9fTXRuICkNCg0KIyBSZXZpc3RhIElERUUNCiMgUHJvZHVjY2nDs24gY3J1ZG8gcG9yIGFkbWluaXN0cmFjacOzbiB5IGNvbnRyYXRvcw0KY3VhZHJvXzIuMSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgcGV0cm9sZW8gY3J1ZG8geSBkZXJpdmFkb3MgMTk3MCAtIDE5ODkueGxzeCIsIA0KICAgIHNraXAgPSAxLCBzaGVldCA9IDEpICU+JSANCiAgcmVuYW1lKHVuaWRhZCA9ICIuLi41IikNCg0KI2Jhc2UgTWluaXN0ZXJpbyBkZSBIYWNpZW5kYQ0KaGlkcm9jYXJidXJvc19iYXNlX21lY29uIDwtICByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NZWNvbi9kYXRhc2V0cyB2aWVqb3MvaGlkcm9jYXJidXJvcy5jc3YiLCANCiAgICBsb2NhbGUgPSBsb2NhbGUoZGF0ZV9uYW1lcyA9ICJlcyIsIGVuY29kaW5nID0gIklTTy04ODU5LTEiKSkgJT4lIA0KICBtdXRhdGUoZmVjaGEgPSBhcy5EYXRlKGx1YnJpZGF0ZTo6cGFyc2VfZGF0ZV90aW1lKGluZGljZV90aWVtcG8sIG9yZGVycyA9ICJkbXkiKSkpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBldmVyeXRoaW5nKC4pLCAtYygxOjMsIGZ1ZW50ZSwgaW5kaWNlX3RpZW1wbyxhbGNhbmNlX2lkKSkNCg0KI2xpc3RhIGNvbiBpbmRpY2Fkb3Jlcw0KbGlzdGFfZmlsdHJvIDwtIHVuaXF1ZShoaWRyb2NhcmJ1cm9zX2Jhc2VfbWVjb24kaW5kaWNhZG9yKQ0KDQoNCnByb2RfbWVjb25fY3J1ZG8gPC0gaGlkcm9jYXJidXJvc19iYXNlX21lY29uICU+JSANCiAgZmlsdGVyKCBpbmRpY2Fkb3IgPT0gbGlzdGFfZmlsdHJvWzNdLA0KICAgICAgICAgYWN0aXZpZGFkX3Byb2R1Y3RvX25vbWJyZSA9PSAiUGV0csOzbGVvIGNydWRvIiwNCiAgICAgICAgIGZyZWN1ZW5jaWFfbm9tYnJlID09ICJNZW5zdWFsIikgJT4lICANCiAgbXV0YXRlKGFuaW8gPSB5ZWFyKGZlY2hhKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCBhY3RpdmlkYWRfcHJvZHVjdG9fbm9tYnJlLCBpbmRpY2Fkb3IsIHVuaWRhZF9kZV9tZWRpZGEpICU+JSANCiAgc3VtbWFyaXNlKGNydWRvX21lY29uID0gc3VtKHZhbG9yKSkNCg0KDQojQmFzZSByZWdhbGlhcw0KcHJvZF9yZWdhbGlhc19jcnVkbyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JlZ2FsaWFzL3Byb2R1Y2Npb25fY3J1ZG9fcmVnYWxpYXMuY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDkU8iKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAibTMiLA0KICAgICAgICAgYW5pbyA9em9vOjpuYS5sb2NmKGFuaW8pLA0KICAgICAgICAgZmVjaGEgPSBhcy5EYXRlKHBhcnNlX2RhdGVfdGltZShwYXN0ZTAoYW5pbywgTUVTKSwgb3JkZXJzID0gInltIikpKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgTUVTLCBhbmlvLCB1bmlkYWQsICJUT1RBTCBDVUVOQ0EiLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogIHJlbmFtZShwcm9kX2NydWRvX20zID0gIlRPVEFMIENVRU5DQSIpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkICkgJT4lIA0KICBzdW1tYXJpc2UoY3J1ZG9fcmVnYWxpYXMgPSBzdW0ocHJvZF9jcnVkb19tMykpDQoNCiNCYXNlIFNFU0NPIC5jc3YgIChQcmUgMjAwOSkNCnByb2Rfc2VzY29fY3J1ZG9fYSA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9wcm9kdWNjaW4tZGUtcGV0cmxlby1hbnRlcmlvci1hbC0yMDA5LmNzdiIpICU+JQ0KICBzZWxlY3QoYW5pbywgbWVzLGlkY29uY2VwdG8sIGNvbmNlcHRvLCBDYW50aWRhZCApICU+JQ0KICByZW5hbWUoY2FudGlkYWQgPSBDYW50aWRhZCkgJT4lDQogICMgZmlsdGVyKCFpZGNvbmNlcHRvICVpbiUgYyg0LCA1LCA3LCA4LCA5CSkpICU+JQ0KICBmaWx0ZXIoaWRjb25jZXB0byAlaW4lIGMoMSwyLDMsIDYpKSAlPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lDQogIHN1bW1hcmlzZShjcnVkb19zZXNjbyA9IHN1bShjYW50aWRhZCwgbmEucm0gPSBUKSkgJT4lDQogIG11dGF0ZSh1bmlkYWQgPSAibTMiKQ0KDQojIEJhc2UgU0VTQ08gKFBvc3QgMjAwOSkNCnByb2Rfc2VzY29fY3J1ZG9fYiA8LSByZWFkX2NzdigNCiAgIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvU0VTQ08vcHJvZHVjY2luLWRlLXBldHJsZW8tcG9yLXlhY2ltaWVudG8uY3N2IikgJT4lIA0KICBzZWxlY3QoYW5pbywgbWVzLGlkY29uY2VwdG8sIGNvbmNlcHRvLCBjYW50aWRhZCApICU+JQ0KICAjIGZpbHRlcighaWRjb25jZXB0byAlaW4lIGMoNCwgNSwgNywgOCwgOQkpKSAlPiUNCiAgZmlsdGVyKGlkY29uY2VwdG8gJWluJSBjKDEsMiwzLCA2KSklPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lDQogIHN1bW1hcmlzZShjcnVkb19zZXNjbyA9IHN1bShjYW50aWRhZCwgbmEucm0gPSBUKSkgJT4lDQogIG11dGF0ZSh1bmlkYWQgPSAibTMiKQ0KDQpwcm9kX3Nlc2NvX2NydWRvIDwtIHByb2Rfc2VzY29fY3J1ZG9fYSAlPiUgDQogIGJpbmRfcm93cyhwcm9kX3Nlc2NvX2NydWRvX2IpDQoNCiNFSUENCg0KI3VuaWRhZCBvcmlnaW5hbCA9IGJhcnJlbHMgcGVyIGRheQ0KDQojIFRvdGFsIFBldHJvbGV1bSBhbmQgb3RoZXIgbGlxdWlkcyBwcm9kdWN0aW9uID0gQ3J1ZGUgb2lsLCBOR1BMLCBhbmQgb3RoZXIgbGlxdWlkcyBwcm9kdWN0aW9uICsgUmVmaW5lcnkgcHJvY2Vzc2luZyBnYWluDQojIENydWRlIG9pbCwgTkdQTCwgYW5kIG90aGVyIGxpcXVpZHMgcHJvZHVjdGlvbiA9IENydWRlIG9pbCBpbmNsdWRpbmcgbGVhc2UgY29uZGVuc2F0ZSBwcm9kdWN0aW9uICsgTmF0dXJhbCBnYXMgcGxhbnQgbGlxdWlkcyBwcm9kdWN0aW9uICsgT3RoZXIgbGlxdWlkcyBwcm9kdWN0aW9uDQoNCnByb2RfZWlhX2NydWRvIDwtICByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvRUlBL2RhdGEvb2lsX3Byb2R1Y3Rpb25fYXJnLmNzdiIsIA0KICAgIHRyaW1fd3MgPSBGQUxTRSwgc2tpcCA9IDEpICU+JSANCiAgZmlsdGVyKCFpcy5uYShBUEkpKSAlPiUgDQogIHNlbGVjdCgtQVBJKSAlPiUgDQogIGdhdGhlciguLA0KICAgICAgICAga2V5ID0gYW5pbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAyOm5jb2woLikpICU+JSANCiAgc3ByZWFkKC4sDQogICAgICAgICBrZXkgPSBYMiwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IpICU+JSANCiAgcmVuYW1lKHRvdGFsX29pbF9hbmRfb3RoZXIgPSBgICAgICAgICBUb3RhbCBwZXRyb2xldW0gYW5kIG90aGVyIGxpcXVpZHMgKE1iL2QpYCwNCiAgICAgICAgIGNydWRlX29pbF9jb25kZW5zYXRlID0gYCAgICAgICAgICAgICAgICBDcnVkZSBvaWwgaW5jbHVkaW5nIGxlYXNlIGNvbmRlbnNhdGUgKE1iL2QpYCwNCiAgICAgICAgIG5hdHVyYWxfZ2FzID0gYCAgICAgICAgICAgICAgICBOR1BMIChNYi9kKWAsDQogICAgICAgICBvdGhlcl9saXF1aWRzID0gYCAgICAgICAgICAgICAgICBPdGhlciBsaXF1aWRzIChNYi9kKWAsDQogICAgICAgICBjcnVkZV9vaWxfbmdwbF9vdGhlcl9saXF1aWRzID0gYCAgICAgICAgICAgIENydWRlIG9pbCwgTkdQTCwgYW5kIG90aGVyIGxpcXVpZHMgKE1iL2QpYCwNCiAgICAgICAgIHJlZmluZXJ5X3Byb2Nlc3NpbmdfZ2FpbiA9IGAgICAgICAgICAgICBSZWZpbmVyeSBwcm9jZXNzaW5nIGdhaW4gKE1iL2QpYCkgJT4lIA0KICBtdXRhdGVfYXQoLnZhcnMgPSAoYygiY3J1ZGVfb2lsX2NvbmRlbnNhdGUiLCAibmF0dXJhbF9nYXMiLCAib3RoZXJfbGlxdWlkcyIsIA0KICAgICAgICAgICAgICAgICAgImNydWRlX29pbF9uZ3BsX290aGVyX2xpcXVpZHMiLCAicmVmaW5lcnlfcHJvY2Vzc2luZ19nYWluIiAgLCJ0b3RhbF9vaWxfYW5kX290aGVyIikpLA0KICAgIC5mdW5zID0gZnVuY3Rpb24oeCkge3ggKiAzNjUgKiAxMDAwfSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGFzLmRvdWJsZShhbmlvKSwNCiAgICAgICAgIHVuaWRhZCA9ICJiYXJyaWxlcyIpDQoNCiNFSUEgYWxsIGRhdGENCmVpYV9hbGxfZGF0YSA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvRUlBL2RhdGEvYXJnZW50aW5hL0lOVC1FeHBvcnQtMDktMTctMjAyMF8xMS0xNS0xNi5jc3YiLCANCiAgICBza2lwID0gMSkNCg0KDQojIENvbXBhcmFjacOzbiBlbnRyZSBzZXJpZXMNCnByb2RfbWVyZ2VfY3J1ZG8gPC0gIHByb2RfcmVnYWxpYXNfY3J1ZG8gJT4lIA0KICBsZWZ0X2pvaW4ocHJvZF9tZWNvbl9jcnVkbyAgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgY3J1ZG9fbWVjb24pKSAlPiUNCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgY3J1ZG9fcmVnYWxpYXMsIGNydWRvX21lY29uKSAlPiUgDQogIGxlZnRfam9pbihwcm9kX3Nlc2NvX2NydWRvKSAlPiUgDQogIGZ1bGxfam9pbihwcm9kX2FudWFyaW8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgY3J1ZG9fYW51YXJpbykgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUodW5pZGFkID0gIm0zIikpICU+JSANCiAgIyBtdXRhdGUoZGlmID0gIGNydWRvX3JlZ2FsaWFzL2NydWRvX21lY29uLTEpICU+JSANCiAgbXV0YXRlX2F0KC52YXJzID0gYyggICAiY3J1ZG9fcmVnYWxpYXMiICwiY3J1ZG9fbWVjb24iLCAgIA0KICAgICAgICAgICAgICAgICAgICAgICAiY3J1ZG9fc2VzY28iLCAgICAiY3J1ZG9fYW51YXJpbyIgKSwgDQogICAgICAgICAgICAuZnVucyA9IGNvbnZlcnNvcl9tM2JibF9xKSAlPiUgIA0KICBsZWZ0X2pvaW4ocHJvZF9laWFfY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgY3J1ZG9fZWlhID0gY3J1ZGVfb2lsX2NvbmRlbnNhdGUpKSAlPiUgDQogICBtdXRhdGUocHJvZF9jcnVkbyA9ICBjYXNlX3doZW4oYW5pbyA8IDE5OTMgfiBjcnVkb19hbnVhcmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPiAxOTkyIH4gY3J1ZG9fc2VzY28pLA0KICAgICAgICAgIHVuaWRhZCA9ICJiYXJyaWxlcyIsIA0KICAgICAgICAgIHZhcmlhYmxlID0gICJQcm9kdWNjacOzbiBkZSBjcnVkbyBzZWfDum4gZGlzdGludGFzIGZ1ZW50ZXMiKSAgJT4lDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBzZWxlY3QoYW5pbywgdmFyaWFibGUsIHVuaWRhZCwgcHJvZF9jcnVkbywgZXZlcnl0aGluZyguKSkgJT4lIA0KICByZW5hbWUocmVnYWxpYXMgPSBjcnVkb19yZWdhbGlhcywNCiAgICAgICAgIG1lY29uID0gY3J1ZG9fbWVjb24sDQogICAgICAgICBzZXNjbyA9IGNydWRvX3Nlc2NvLA0KICAgICAgICAgYW51YXJpb19jb21idXN0aWJsZXMgPSBjcnVkb19hbnVhcmlvLA0KICAgICAgICAgZWlhID0gY3J1ZG9fZWlhKSAlPiUgDQogIGZpbHRlcihhbmlvIDwgMjAyMSkNCg0KDQojIHdyaXRlLmNzdihwcm9kX21lcmdlX2NydWRvLCBmaWxlID0gInJlc3VsdGFkb3MvcHJvZHVjY2lvbl9jcnVkby5jc3YiKQ0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByb2RfbWVyZ2VfY3J1ZG8sIA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9wcm9kdWNjaW9uX2NydWRvLnhsc3giKQ0KDQojZGlmZXJlbmNpYSBwcm9tZWRpbyBkZWwgNiUgZW50cmUgbGFzIGJhc2VzIChlcyBtYXlvciBsYSBkZSBtZWNvbikNCiMgc3VtbWFyeShwcm9kX21lcmdlX2NydWRvKQ0KDQoNCiNFeGlzdGVuY2lhcw0KZXhpc3RlbmNpYXNfcGV0cm9sZW8gPC0gcmVhZF9leGNlbCgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvZXhpc3RlbmNpYXNfY3J1ZG8ueGxzeCIpICU+JQ0KICBmaWx0ZXIoIShpcy5uYShleGlzdGVuY2lhcyApKSkgJT4lIA0KICByZW5hbWUoZXhpc3RlbmNpYXNfY3J1ZG8gPSBleGlzdGVuY2lhcykgJT4lIA0KICBtdXRhdGUoZXhpc3RlbmNpYXNfY3J1ZG8gPSBjb252ZXJzb3JfbTNiYmxfcShleGlzdGVuY2lhc19jcnVkbyksDQogICAgICAgICB1bmlkYWQgPSAiYmFycmlsZXMiKQ0KDQojIHBsb3QoZXhpc3RlbmNpYXNfcGV0cm9sZW8kYW5pbywgZXhpc3RlbmNpYXNfcGV0cm9sZW8kZXhpc3RlbmNpYXNfY3J1ZG8pDQoNCmBgYA0KDQo8YnI+DQoqKlRhYmxhIDEuIFByb2R1Y2Npw7NuIGRlIHBldHLDs2xlbyBjcnVkbyBlbiBBcmdlbnRpbmEgc2Vnw7puIGRpc3RpbnRhcyBmdWVudGVzIChiYXJyaWxlcykqKg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnByb2RfbWVyZ2VfY3J1ZG8gJT4lIA0KICBzZWxlY3QoLXByb2RfY3J1ZG8pDQogDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90bHkocHJvZF9tZXJnZV9jcnVkbyAlPiUgDQogIG11dGF0ZShyZWdhbGlhcyA9IGNhc2Vfd2hlbihyZWdhbGlhcyA9PSAwIH4gTkFfcmVhbF8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gcmVnYWxpYXMpKSAlPiUNCiAgICBzZWxlY3QoLXByb2RfY3J1ZG8pICU+JSANCiAgZ2F0aGVyKGtleSA9IGZ1ZW50ZSwgdmFsdWUgPSB2YWxvciwgNDpuY29sKC4pKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gZnVlbnRlKSkrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHRpdGxlID0gIkdyw6FmaWNvIDEuIFByb2R1Y2Npw7NuIGRlIHBldHLDs2xlbyBjcnVkby4NCiAgICAgICAgQXJnZW50aW5hICgxOTExIC0gMjAyMCkiLA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgQmFycmlsZXMiLA0KICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiBlbGFib3JhY2nDs24gcHJvcGlhIGVuIGJhc2UgYSBBbnVhcmlvIGRlIENvbWJ1c3RpYmxlcywgRUlBLCBNaW5pc3RlcmlvIGRlIEVjb25vbcOtYSwgU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgKEJhc2UgUmVnYWzDrWFzIHkgU0VTQ08pIikrDQogICMgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1mdW5jdGlvbih4KSBmb3JtYXQoeCwgYmlnLm1hcmsgPSAiLiIsIHNjaWVudGlmaWMgPSBGQUxTRSkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjp1bml0X2Zvcm1hdCh1bml0ID0iIiwgc2NhbGUgPSAxZS02KSkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCiAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgDQpgYGANCg0KDQoNCiMjIyBQcm9kdWNjacOzbiBkZSBHYXMgTmF0dXJhbA0KDQpBbCBpZ3VhbCBxdWUgZW4gbGEgcHJvZHVjY2nDs24gZGUgcGV0csOzbGVvIGNydWRvLCBsYSBzZXJpZSBkZSBsYXJnbyBwbGF6byBkZSBwcm9kdWNjacOzbiBkZSBnYXMgcHJvdmllbmUgZGVsIEFudWFyaW8gZGUgQ29tYnVzdGlibGVzLCBkZSBsYSBjdWFsIGNvbnRhbW9zIGRhdG9zIGRlc2RlIDE5MTMgaGFzdGEgMTk5Mi4gQSBkaWZlcmVuY2lhIGRlbCBjcnVkbywgc3VzIHZhbG9yZXMgcGFyYSBlbCBwZXLDrW9kbyAxOTgwLTE5OTIgbm8gY29pbmNpZGVuIGNvbiBsb3MgZGUgRUlBLCBwZXJvIGVzdMOhIMO6bHRpbWEgc8OtIGNvaW5jaWRlIGNvbiBsb3MgZGUgUmVnYWzDrWFzIGVudHJlIDE5OTkgeSAyMDE1LiBFbiBjYW1iaW8sIGxhIHNlcmllIGRlIFNFU0NPLCB0aWVuZGUgYSBjb250aW51YXIgbGEgZXZvbHVjacOzbiBkZSBFSUEgeSBSZWdhbMOtYXMsIHBlcm8gY29uIGVsIG5pdmVsIGRlbCBBbnVhcmlvIGRlIENvbWJ1c3RpYmxlcywgcG9yIGxvIHF1ZSBhbWJvcyBwYXJlcyBkZSBzZXJpZXMgcHVlZGVuIGVtcGFsbWFyIGNvaGVyZW50ZW1lbnRlIHNlZ8O6biBzdSBuaXZlbC4gTnVldmFtZW50ZSwgbG9zIHZhbG9yZXMgZGUgbGEgYmFzZSBkZSBSZWdhbMOtYXMgc29uIG1lbm9yZXMgZGViaWRvIGEgbGFzIGRlZHVjY2lvbmVzIGRlIHByb2R1Y2Npw7NuIHBhcmEgdHJpYnV0YXIgbWVub3MgcmVnYWzDrWFzLiBMYSBzZXJpZSBkZWwgTWluaXN0ZXJpbyBkZSBFY29ub23DrWEgdG9tYSBsb3MgdmFsb3JlcyBkZSBTRVNDTy5Qb3IgbG8gdGFudG8sIGVsIGNyaXRlcmlvIGRlIHNlbGVjY2nDs24gcGFyYSBsYSBzZXJpZSBkZSBwcm9kdWNjacOzbiBkZSBnYXMgcGFyYSBsb3MgY8OhbGN1bG9zIGVzIGVsIHNpZ3VpZW50ZToNCg0KKiBDcml0ZXJpbyBkZSBjw7NtcHV0byBkZSBsYSBwcm9kdWNjacOzbiBkZSBnYXM6DQogICsgMTkxMSBhIDE5OTI6IEFudWFyaW8gZGUgY29tYnVzdGlibGVzIA0KICArIDE5OTMgZW4gYWRlbGFudGU6IFNFU0NPIERvd25zdHJlYW0NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNCYXNlIE1FQ09ODQpwcm9kX21lY29uX2dhcyA8LSBoaWRyb2NhcmJ1cm9zX2Jhc2VfbWVjb24gJT4lIA0KICBmaWx0ZXIoaW5kaWNhZG9yID09IGxpc3RhX2ZpbHRyb1szXSwNCiAgICAgICAgIGFjdGl2aWRhZF9wcm9kdWN0b19ub21icmUgPT0gIkdhcyBuYXR1cmFsIiwNCiAgICAgICAgIGZyZWN1ZW5jaWFfbm9tYnJlID09ICJNZW5zdWFsIikgJT4lICANCiAgbXV0YXRlKGFuaW8gPSB5ZWFyKGZlY2hhKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCBhY3RpdmlkYWRfcHJvZHVjdG9fbm9tYnJlLCBpbmRpY2Fkb3IsIHVuaWRhZF9kZV9tZWRpZGEpICU+JSANCiAgc3VtbWFyaXNlKGdhc19tZWNvbiA9IHN1bSh2YWxvcikpDQoNCiNCYXNlIHJlZ2FsaWFzDQpwcm9kX3JlZ2FsaWFzX2dhcyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JlZ2FsaWFzL3Byb2R1Y2Npb25fZ2FzX3JlZ2FsaWFzLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw5FPIikgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIk1pbGVzIGRlIG0zIiwNCiAgICAgICAgIGFuaW8gPSB6b286Om5hLmxvY2YoYW5pbyksDQogICAgICAgICBmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHBhc3RlMChhbmlvLCBNRVMpLCBvcmRlcnMgPSAieW0iKSkpICU+JSANCiAgc2VsZWN0KGZlY2hhLCB1bmlkYWQsICJUT1RBTCBDVUVOQ0EiLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogIHJlbmFtZShwcm9kX2dhc19NbTMgPSAiVE9UQUwgQ1VFTkNBIikgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQgKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKSAlPiUgDQogIHN1bW1hcmlzZShnYXNfcmVnYWxpYXMgPSBzdW0ocHJvZF9nYXNfTW0zKSkNCg0KI0Jhc2UgU0VTQ08NCiNwcmUgMjAwOQ0KcHJvZF9zZXNjb19nYXNfYSA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9wcm9kdWNjaW4tZGUtZ2FzLWFudGVyaW9yLWFsLTIwMDkuY3N2IikgICU+JSANCiAgc2VsZWN0KGFuaW8sIG1lcyxpZGNvbmNlcHRvLCBjb25jZXB0bywgQ2FudGlkYWQgKSAlPiUNCiAgcmVuYW1lKGNhbnRpZGFkID0gQ2FudGlkYWQpICU+JQ0KICBmaWx0ZXIoaWRjb25jZXB0byAhPSA0KSAlPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lDQogIHN1bW1hcmlzZShnYXNfc2VzY28gPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpICU+JQ0KICBtdXRhdGUodW5pZGFkID0gIk1pbGVzIGRlIG0zIikNCg0KI3Bvc3QgMjAwOQ0KcHJvZF9zZXNjb19nYXNfYiA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9wcm9kdWNjaW4tZGUtZ2FzLXBvci15YWNpbWllbnRvLmNzdiIpICU+JSANCiAgc2VsZWN0KGFuaW8sIG1lcyxpZGNvbmNlcHRvLCBjb25jZXB0bywgY2FudGlkYWQgKSAlPiUNCiAgZmlsdGVyKGlkY29uY2VwdG8gJWluJSBjKDEsMiwzKSklPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lDQogIHN1bW1hcmlzZShnYXNfc2VzY28gPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpICU+JQ0KICBtdXRhdGUodW5pZGFkID0gIk1pbGVzIGRlIG0zIikNCg0KcHJvZF9zZXNjb19nYXMgPC0gcHJvZF9zZXNjb19nYXNfYSAlPiUNCiAgYmluZF9yb3dzKHByb2Rfc2VzY29fZ2FzX2IpDQoNCg0KI0VJQQ0KcHJvZF9laWFfZHJ5X25hdHVyYWxfZ2FzIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9FSUEvZGF0YS9EcnlfbmF0dXJhbF9nYXNfcHJvZHVjdGlvbl9BcmdlbnRpbmFfQW5udWFsLmNzdiIsIA0KICAgIHNraXAgPSA0KSAgJT4lIA0KICByZW5hbWUoYW5pbyA9IFllYXIsDQogICAgICAgICBwcm9kX2VpYSA9IGBTZXJpZXMgSUQ6IElOVEwuMjYtMS1BUkctQkNGLkEgYmlsbGlvbiBjdWJpYyBmZWV0YCkgJT4lIA0KICBtdXRhdGUocHJvZF9laWEgPSBjb252ZXJzb3JfZnQzbTNfcShwcm9kX2VpYSAqIDEwMDAwMDApLA0KICAgICAgICAgdW5pZGFkID0gIk1pbGVzIGRlIG0zIikNCg0KDQojIENvbXBhcmFjacOzbiBlbnRyZSBzZXJpZXMNCnByb2RfbWVyZ2VfZ2FzIDwtICBwcm9kX3JlZ2FsaWFzX2dhcyAlPiUgDQogIGxlZnRfam9pbihwcm9kX21lY29uX2dhcyAgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZ2FzX21lY29uKSkgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGdhc19yZWdhbGlhcywgZ2FzX21lY29uKSAlPiUgDQogIGxlZnRfam9pbihwcm9kX3Nlc2NvX2dhcykgJT4lICANCiAgZnVsbF9qb2luKHByb2RfYW51YXJpbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBnYXNfYW51YXJpbyA9IGdhc19hbnVhcmlvX01NbTMgKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShnYXNfYW51YXJpbyA9IGdhc19hbnVhcmlvICogMTAwMCwNCiAgICAgICAgICAgICAgICAgICAgIHVuaWRhZCA9ICJNaWxlcyBkZSBtMyIpKSAlPiUgDQogIGxlZnRfam9pbihwcm9kX2VpYV9kcnlfbmF0dXJhbF9nYXMgJT4lIHJlbmFtZShnYXNfZWlhID0gcHJvZF9laWEpKSAlPiUgDQogIG11dGF0ZShwcm9kX2dhcyA9IGNhc2Vfd2hlbihhbmlvIDwgMTk5MyB+IGdhc19hbnVhcmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPiAxOTkyIH4gZ2FzX3Nlc2NvKSwNCiAgICAgICAgICB2YXJpYWJsZSA9ICAiUHJvZHVjY2nDs24gZGUgZ2FzIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyIpICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogIHNlbGVjdChhbmlvLCB2YXJpYWJsZSwgdW5pZGFkLCBwcm9kX2dhcywgZXZlcnl0aGluZyguKSkgJT4lIA0KICAgZmlsdGVyKCFpcy5uYShwcm9kX2dhcykpICU+JSANCiAgcmVuYW1lKHJlZ2FsaWFzID0gZ2FzX3JlZ2FsaWFzLA0KICAgICAgICAgbWVjb24gPSBnYXNfbWVjb24sDQogICAgICAgICBzZXNjbyA9IGdhc19zZXNjbywNCiAgICAgICAgIGFudWFyaW9fY29tYnVzdGlibGVzID1nYXNfYW51YXJpbywNCiAgICAgICAgIGVpYSA9IGdhc19laWEpICU+JSANCiAgZmlsdGVyKGFuaW8gPCAyMDIxKQ0KDQoNCiMgd3JpdGUuY3N2KHByb2RfbWVyZ2VfZ2FzLCBmaWxlID0gInJlc3VsdGFkb3MvcHJvZHVjY2lvbl9nYXMuY3N2IikNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcm9kX21lcmdlX2dhcywgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL3Byb2R1Y2Npb25fZ2FzLnhsc3giKQ0KDQojZGlmZXJlbmNpYSBwcm9tZWRpbyBkZWwgMTQlIGVudHJlIGxhcyBiYXNlcyAoZXMgbWF5b3IgbGEgZGUgbWVjb24pDQojIHN1bW1hcnkocHJvZF9tZXJnZV9nYXMpDQoNCnByb2RfbWVyZ2VfZ2FzX01NQlRVIDwtIHByb2RfbWVyZ2VfZ2FzICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdmFyaWFibGUsIHVuaWRhZCkgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHtjb252ZXJzb3JfbTNNTUJUVV9xKHgqMTAwMCl9KSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTU1CVFUiKSAlPiUNCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCiAgDQpwcm9kX21lcmdlX2dhc19iZXAgPC0gcHJvZF9tZXJnZV9nYXNfTU1CVFUgJT4lIA0KICBncm91cF9ieShhbmlvLCB2YXJpYWJsZSwgdW5pZGFkKSAlPiUgDQogIG11dGF0ZV9hbGwoY29udmVyc29yX01NQlRVYmVwX3EpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJCRVAiKQ0KICANCiMgd3JpdGUuY3N2KHByb2RfbWVyZ2VfZ2FzX2JlcCwgZmlsZSA9ICJyZXN1bHRhZG9zL3Byb2RfbWVyZ2VfZ2FzX2JlcC5jc3YiKQ0KYGBgDQoNCjxicj4NCioqVGFibGEgMi4gUHJvZHVjY2nDs24gZGUgZ2FzIG5hdHVyYWwgZW4gQXJnZW50aW5hIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyAoTU1CVFUpKioNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwcm9kX21lcmdlX2dhc19NTUJUVSAlPiUgDQogIHNlbGVjdCgtcHJvZF9nYXMpDQoNCmBgYA0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdGx5KHByb2RfbWVyZ2VfZ2FzX01NQlRVICU+JSANCiAgICAgICAgICAgc2VsZWN0KC1wcm9kX2dhcykgJT4lDQogIG11dGF0ZShyZWdhbGlhcyA9IGNhc2Vfd2hlbihyZWdhbGlhcyA9PSAwIH4gTkFfcmVhbF8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gcmVnYWxpYXMpKSAlPiUgDQogIGdhdGhlcihrZXkgPSBmdWVudGUsIHZhbHVlID0gdmFsb3IsIDQ6bmNvbCguKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGZ1ZW50ZSkpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICJHcsOhZmljbyAyLiBQcm9kdWNjacOzbiBkZSBnYXMuDQogICAgICAgIEFyZ2VudGluYSAoMTkxMyAtIDIwMjApIiwNCiAgICAgICB5ID0gIk1NQlRVIiwNCiAgICAgICBjYXB0aW9uID0gIkZ1ZW50ZTogZWxhYm9yYWNpw7NuIHByb3BpYSBlbiBiYXNlIGEgQW51YXJpbyBkZSBDb21idXN0aWJsZXMsIEVJQSwgTWluaXN0ZXJpbyBkZSBFY29ub23DrWEsIFNlY3JldGFyw61hIGRlIEVuZXJnw61hIChCYXNlIFJlZ2Fsw61hcyB5IFNFU0NPKSIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKHgpIGZvcm1hdCh4LCBiaWcubWFyayA9ICIuIiwgc2NpZW50aWZpYyA9IEZBTFNFKSkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KDQojIyMgUHJvZHVjY2lvbiB0b3RhbA0KYGBge3J9DQpwcm9kdWNjaW9uX3RvdGFsIDwtIHByb2RfbWVyZ2VfZ2FzX2JlcCAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQscHJvZF9nYXMpICU+JQ0KICBsZWZ0X2pvaW4ocHJvZF9tZXJnZV9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQscHJvZF9jcnVkbykgJT4lICBtdXRhdGUodW5pZGFkID0iQkVQIikgKSAlPiUgDQogIG11dGF0ZShwcm9kdWNjaW9uX3RvdGFsX2JlcCA9IHByb2RfY3J1ZG8gKyBwcm9kX2dhcykNCg0KcHJvZHVjY2lvbl90b3RhbA0KYGBgDQoNCg0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIyBDcnVkbyBwcm9jZXNhZG8NCg0KYGBgDQoNCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyMgVmVudGFzDQogIyBDcnVkbyB5IEdhcw0KDQojICogW1NFU0NPIC0gUmVmaW5hY2nDs24geSBDb21lcmNpYWxpemFjacOzbiBkZSBwZXRyw7NsZW8sIGdhcyB5IGRlcml2YWRvc10oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L3JlZmluYWNpb24teS1jb21lcmNpYWxpemFjaW9uLWRlLXBldHJvbGVvLWdhcy15LWRlcml2YWRvcy10YWJsYXMtZGluYW1pY2FzKQ0KIyANCiMgIERhdG9zIGRlIGNhbnRpZGFkZXMNCiMgIA0KI2NvbXByYXMgZW1wcmVzYXMgZGVsIHNlY3Rvcg0KY29tcHJhcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9SZWZpbmFjacOzbiB5IGNvbWVyY2lhbGl6YWNpb24vY29tcHJhcy5jc3YiKQ0KDQojdmVudGFzIG1kbyBpbnRlcm5vLiBjYW50aWRhZGVzLiBwb3N0IDIwMTANCnZlbnRhc19tZXJjYWRvX3Byb2R1Y3RvX2VtcHJlc2EgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvU0VTQ08vUmVmaW5hY2nDs24geSBjb21lcmNpYWxpemFjaW9uL3ZlbnRhcy1tZXJjYWRvLXByb2R1Y3RvLWVtcHJlc2EuY3N2IiwgDQogICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gIklTTy04ODU5LTEiKSkNCg0KI3ZlbnRhcyBtZG8gaW50ZXJuby4gY2FudGlkYWRlcy4gcG9zdCAyMDEwDQp2ZW50YXNfYV9lbXByZXNhc19kZWxfc2VjdG9yIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1NFU0NPL1JlZmluYWNpw7NuIHkgY29tZXJjaWFsaXphY2lvbi92ZW50YXMtYS1lbXByZXNhcy1kZWwtc2VjdG9yLmNzdiIpDQoNCmBgYA0KDQoNCiMjIFByZWNpbyBNZXJjYWRvIEludGVybm8NCg0KRnVlbnRlczogDQoNCiogW0Jhc2UgTWluaXN0ZXJpbyBkZSBIYWNpZW5kYSwgSW5mb3JtZXMNClNlY3RvcmlhbGVzXShodHRwczovL3d3dy5hcmdlbnRpbmEuZ29iLmFyL2Vjb25vbWlhL3BvbGl0aWNhZWNvbm9taWNhL3JlZ2lvbmFseXNlY3RvcmlhbC9pbmZvcm1lc3Byb2R1Y3Rpdm9zKQ0KKiBbU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEtUmVnYWxpYXNdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9yZWdhbGlhcy1kZS1wZXRyb2xlby1jcnVkby1nYXMtbmF0dXJhbC1nbHAtZ2Fzb2xpbmEteS1jb25kZW5zYWRvKQ0KICArIFBvciBhdXNlbmNpYSBkZSBpbmZvcm1hY2nDs24sIGVsIHByZWNpbyBkZSByZWdhbGlhcyBlbnRyZSAxOTkzIHkgMTk5OCBlcyBlbCBwcmVjaW8gdG90YWwgKGVzIGRlY2lyLCBlcyB1biBwb25kZXJhZG8gcXVlIGluY2x1eWUgdGFtYmnDqW4gZWwgcHJlY2lvIGRlbCBtZXJjYWRvIGV4dGVybm8pLiBFbiBsb3MgYcOxb3MgcG9zdGVyaW9yZXMsIGRpY2hvIHByZWNpbyBzw60gY29ycmVzcG9uZGUgYWwgZGVsIG1lcmNhZG8gaW50ZXJuby4gIA0KKiBLb3p1bGogeSBQaXN0b25lc2kuIFJldmlzdGEgIGRlbCBJbnN0aXR1dG8gZGUgRWNvbm9tw61hIEVuZXJnw6l0aWNhIChJREVFKSAtIEZ1bmRhY2nDs24gQmFyaWxvY2hlICAoMTk3MCAtIDE5ODgpLiBQcmVjaW8gb2ZpY2lhbCBpbnRlcm5vIGRlIGxhIGN1ZW5jYSBuZXVxdWluYSBhIHRhc2EgZGUgY2FtYmlvIG9maWNpYWwuIExhcyBmdWVudGVzIHV0aWxpemFkYXMgZGUgZXN0YSByZXZpc3RhIHNvbiBTZWNyZXRhcmlhIGRlIEVuZXJnw61hLCBZUEYsIEdhcyBkZWwgRXN0YWRvLCBCb2xldGluIEluZm9ybWF0aXZvIGRlIFRlY2hpbnQgeSBzZXJpZXMgcHJvcGlhcyBkZSBJREVFDQoqIE1lbW9yaWEgQW51YWwgeSBiYWxhbmNlcyBjb250YWJsZXMgZGUgWVBGICh2YXJpb3MgYcOxb3MpLiBQcmVjaW8gaW50ZXJvIHByb21lZGlvIHJlc3VsdGFudGUgZGUgbGEgcmVsYWNpw7NuIGVudHJlIHZlbnRhcyB5IGNhbnRpZGFkZXMgcHJvZHVjaWRhcy4NCiogUHJlY2lvcyBhbnVhcmlvLiAqKkZBTFRBIEJVU0NBUioqDQoNCioqKnZlciBkZSBkb25kZSBzYWNhbiBlbCBUQ0MqKioNCioqKmNhbWJpYXIgcHJlY2lvIGRlbCA5MiBwb3IgbWVjb24gZXN0aW1hZG8geSB2YWxvcmVzIHJlc3RhbnRlcyBwb3IgZXN0aW1hZG8gZGUgaWRlZSoqKg0KDQojIyMjICBQcmVjaW8gTWVyY2FkbyBJbnRlcm5vIGRlIENydWRvDQoNCiogQ3JpdGVyaW8gcGFyYSBwcmVjaW9fY3J1ZG86IA0KICArIDE5NjMgYSAxOTY1OiBLb3p1bGogeSBQaXN0b25lc2kgLSBSZXZpc3RhIElERUUgYWp1c3RhZG8gY29uIGVsIMOtbmRpY2UgZGVsIHByZWNpbyBkZWwgQW51YXJpbyBkZSBZUEYgDQogICsgMTk4OSBhIDE5OTE6IEFudWFyaW8gZGUgWVBGDQogICsgMTk2NiBhIDE5ODg6IEtvenVsaiB5IFBpc3RvbmVzaSAtIFJldmlzdGEgSURFRQ0KICArIDE5OTI6IE1FQ09OIGFqdXN0YWRvIGNvbiBsYSB2YXJpYWNpw7NuIGRlbCDDjW5kaWNlIGRlIHByZWNpb3MgaW50ZXJub3MgYWwgcG9yIG1heW9yIChJUElNKQ0KICArIDE5OTMgZW4gYWRlbGFudGU6IE1FQ09OIA0KIA0KICANCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojTWVtb3JpYXMgZGUgWVBGDQp2dGFzX3ByZWNpb19tZW1vX3lwZl9jcnVkbyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01lbW9yaWEgWVBGL3Z0YXNfdmFsb3JfY2FudGlkYWRfcHJlY2lvX2NydWRvLnhsc3giKSAlPiUgDQogIHJlbmFtZShjYW50X3ZlbmRpZGFkID0gIm0zIiwgdmFsb3JfdmVuZGlkbyA9ICJ2YWxvciIsIHByZWNpb19hID0gIiQvbTMiLCANCiAgICAgICAgIHRjY19kaWMgPSAiQ290aXogZGljIFUkUyIsIHByZWNpb191c2QgPSAiVSRTIChhIGRpY2llbWJyZSBkZSBjYWRhIGHDsW8pIikgJT4lIA0KICBtdXRhdGUodW5pZGFkX2NhbnQgPSAibTMiLA0KICAgICAgICAgcHJlY2lvX21pX3Blc29zX3lwZl9jcnVkbyA9IHZhbG9yX3ZlbmRpZG8vY2FudF92ZW5kaWRhZCwgDQogICAgICAgICBwcmVjaW9fbWlfeXBmX2NydWRvID0gcHJlY2lvX21pX3Blc29zX3lwZl9jcnVkbyAvIHRjY19kaWMpICU+JSANCiAgIyBsZWZ0X2pvaW4odGNwX2FudWFsX2IgJT4lIHNlbGVjdChhbmlvLCB0Y2MpKSAlPiUNCiAgIyBtdXRhdGUocHJlY2lvX21pX3VzZF95cGZfY3J1ZG8gPSBwcmVjaW9fbWlfeXBmX2NydWRvIC8gdGNjKSAlPiUgI3JlY2FsY3VsbyBkZSBwcmVjaW8gY29uIG51ZXZvIFRDDQogIHNlbGVjdChhbmlvLHVuaWRhZF9jYW50LCBtb25lZGEsIHZhbG9yX3ZlbmRpZG8sIGNhbnRfdmVuZGlkYWQsIA0KICAgICAgICAgcHJlY2lvX21pX3Blc29zX3lwZl9jcnVkbyx0Y2NfZGljLCAgcHJlY2lvX21pX3lwZl9jcnVkbykNCg0KIyBCYXNlIE1FQ09ODQpwcmVjaW9fbWlfbWVjb25fY3J1ZG8gPC0gaGlkcm9jYXJidXJvc19iYXNlX21lY29uICU+JSANCiAgZmlsdGVyKGluZGljYWRvciA9PSBsaXN0YV9maWx0cm9bMl0sIA0KICAgICAgICAgYWN0aXZpZGFkX3Byb2R1Y3RvX25vbWJyZSA9PSAiUGV0csOzbGVvIGNydWRvIiwNCiAgICAgICAgIGFsY2FuY2VfdGlwbyA9PSAiUEFJUyIpICU+JQ0KICBtdXRhdGUoYW5pbyA9IHllYXIoZmVjaGEpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHByZWNpb19taV9tZWNvbl9jcnVkbyA9IG1lYW4odmFsb3IpKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAidXNkL20zIikNCg0KDQojTUVDT04gLyBDVUVOVEFTIE5BQ0lPTkFMRVMgDQpwcmVjaW9zX21lY29uIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvTWVjb24vYmFzZS1taW5lcmlhLWUtaGlkcm9jYXJidXJvcyBjdWVudGFzIG5hY2lvbmFsZXMueGxzIiwgDQogICAgc2hlZXQgPSAiUHJlY2lvcyIsIHNraXAgPSA3KSAlPiUgDQogIHJlbmFtZShhbmlvID0gIi4uLjEiLA0KICAgICAgICAgbWVzID0gIi4uLjIiLA0KICAgICAgICAgcHJlY2lvX2NvYnJlX2NfbGIgPSAiQ290aXphY2nDs24gQm9sc2EgZGUgTG9uZHJlcyAoTE1FKSIsDQogICAgICAgICBwcmVjaW9fb3JvX3VzZF9venQgPSAgIkNvdGl6YWNpw7NuIEJvbHNhIGRlIE51ZXZhIFlvcmsgKENPTUVYKSIsDQogICAgICAgICBwcmVjaW9fcGxhdGFfdXNkX296dCA9ICJDb3RpemFjacOzbiBMb25kb24gQnVsbGlvbiBNYXJrZXQgQXNzb2NpYXRpb24gKExCTUEpIiwNCiAgICAgICAgIHByZWNpb19jaW5jX2NfbGIgPSAiQ290aXphY2nDs24gTE1FIiwNCiAgICAgICAgIHByZWNpb19oaWVycm9fdXNkX3RuID0gIjY3LDU1JSBCcmFzaWwiLA0KICAgICAgICAgcHJlY2lvX3Bsb21vX3VzZF90biA9ICJMb25kb24gTWV0YWwgRXhjaGFuZ2UiLA0KICAgICAgICAgcHJlY2lvX2dhc19tZV9wZXNvc19NbTMgPSAibWVyY2FkbyBleHRlcm5vLi4uOSIsDQogICAgICAgICBwcmVjaW9fZ2FzX21pX3Blc29zX01tMyA9ICJtZXJjYWRvIGludGVybm8uLi4xMCIsDQogICAgICAgICBwcmVjaW9fY3J1ZG9fbWVfdXNkX20zID0gIm1lcmNhZG8gZXh0ZXJuby4uLjExIiwNCiAgICAgICAgIHByZWNpb19jcnVkb19tZV91c2RfYmJsICA9ICIuLi4xMiIsDQogICAgICAgICBwcmVjaW9fY3J1ZG9fbWlfdXNkX20zID0gIm1lcmNhZG8gaW50ZXJuby4uLjEzIiwNCiAgICAgICAgIHByZWNpb19jcnVkb19taV91c2RfYmJsICA9ICIuLi4xNCIsDQogICAgICAgICBwcm9tZWRpb19icmVudF9kdWJhaV93dGlfdXNkX2JibCA9ICJQcm9tZWRpbyBCcmVudC1EdWJhaS1XVEkiLA0KICAgICAgICAgYnJlbnRfdWtfdXNkX2JibCA9IkJyZW50ICBQdWVydG9zIEdyYW4gQnJldGHDsWEiKSAlPiUgDQogIGZpbHRlcighaXMubmEoYW5pbykpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UocHJlY2lvX2dhc19tZV9wZXNvc19NbTMgPSBtZWFuKHByZWNpb19nYXNfbWVfcGVzb3NfTW0zLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgcHJlY2lvX2dhc19taV9wZXNvc19NbTMgPSBtZWFuKCBwcmVjaW9fZ2FzX21pX3Blc29zX01tMywgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIHByZWNpb19jcnVkb19tZV91c2RfYmJsID0gbWVhbiggcHJlY2lvX2NydWRvX21lX3VzZF9iYmwsIG5hLnJtID0gVCksDQogICAgICAgICAgICBwcmVjaW9fY3J1ZG9fbWlfdXNkX2JibCA9IG1lYW4oIHByZWNpb19jcnVkb19taV91c2RfYmJsLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgcHJvbWVkaW9fYnJlbnRfZHViYWlfd3RpX3VzZF9iYmwgPSBtZWFuKCBwcm9tZWRpb19icmVudF9kdWJhaV93dGlfdXNkX2JibCwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIGJyZW50X3VrX3VzZF9iYmwgPSBtZWFuKCBicmVudF91a191c2RfYmJsLCBuYS5ybSA9IFQpKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWwpICU+JSANCiAgbXV0YXRlKCBwcmVjaW9fY3J1ZG9fbWVfcGVzb3NfYmJsID0gIHByZWNpb19jcnVkb19tZV91c2RfYmJsICpUQ0MsDQogICAgICAgICAgcHJlY2lvX2NydWRvX21pX3Blc29zX2JibCA9ICBwcmVjaW9fY3J1ZG9fbWlfdXNkX2JibCAqVENDKQ0KDQoNCiMjIEJhc2UgcmVnYWxpYXMNCnByZWNpb19taV9yZWdhbGlhc19jcnVkbyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JlZ2FsaWFzL3ByZWNpb19tZXJjYWRvX2ludGVybm9fY3J1ZG9fcmVnYWxpYXMuY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUNCiAgcmVuYW1lKGFuaW8gPSAiQcORTyIsDQogICAgICAgICBtZXMgPSAiTUVTIiwNCiAgICAgICAgIHRvdGFsX3RpcG9fY3J1ZG8gPSAiVE9UQUwgVElQTyBERSBDUlVETyIpICU+JSANCiAgICBtdXRhdGUodW5pZGFkID0gInVzZC9tMyIsDQogICAgICAgICBhbmlvID0gbmEubG9jZihhbmlvKSkgJT4lICANCiAgc2VsZWN0KGFuaW8sIG1lcywgdW5pZGFkLCB0b3RhbF90aXBvX2NydWRvLCBldmVyeXRoaW5nKC4pLCAtYyhCUkVOVCwgV1RJKSkgJT4lIA0KICBnYXRoZXIoLiwNCiAgICAgICAgIGtleSA9ICJ0aXBvX2NydWRvIiwNCiAgICAgICAgIHZhbHVlID0gInZhbG9yIiwNCiAgICAgICAgIDU6bmNvbCguKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQpICU+JQ0KICBzdW1tYXJpc2UocHJlY2lvX21pX3JlZ2FsaWFzX2NydWRvID0gbWVhbih0b3RhbF90aXBvX2NydWRvKSwNCiAgICAgICAgICAgIHByZWNpb19wcm9tZWRpb190aXBvX2NydWRvID0gbWVhbih2YWxvcikpICU+JSANCiAgbXV0YXRlKHRpcG9fcHJlY2lvID0gIm1lcmNhZG8gaW50ZXJubyIpDQoNCiMgUmV2aXN0YSBJREVFDQojIHByZWNpb3MgaW50ZXJub3MgdnMgcHJlY2lvIHByb21lZGlvIGludGVybm8gZGUgZWV1dSB2cyBwcmVjaW8gYXJhYmFpIHNhdWRpdGEuIGN1YWRybyAzLjEuMy4xIHAuMTcwDQpwcmVjaW9fbWlfdnNfaW50ZXJuYWNpb25hbF9pZGVlX2NydWRvIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBwZXRyb2xlbyBjcnVkbyB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OS54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gNCkNCg0KDQojbWVyZ2UNCnByZWNpb19taV9jcnVkbyA8LSBwcmVjaW9fbWlfcmVnYWxpYXNfY3J1ZG8gJT4lICANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX21pX3JlZ2FsaWFzX2NydWRvKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9fbWlfbWVjb25fY3J1ZG8gKSAlPiUgDQogIGZ1bGxfam9pbih2dGFzX3ByZWNpb19tZW1vX3lwZl9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgIHByZWNpb19taV95cGZfY3J1ZG8gKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX21pX3ZzX2ludGVybmFjaW9uYWxfaWRlZV9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwcmVjaW9fbWlfaWRlZV9jcnVkbyA9IHByZWNpb19jcnVkb19uZXVxdWluYV90Y19vZmljaWFsICkpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJ1c2QvbTMiKSAlPiUgDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByZWNpb19taV9yZWdhbGlhc19jcnVkbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICJwcmVjaW9fbWlfbWVjb25fY3J1ZG8iLCAicHJlY2lvX21pX3lwZl9jcnVkbyIsICJwcmVjaW9fbWlfaWRlZV9jcnVkbyIpLCANCiAgICAgICAgICAgIC5mdW5zID0gY29udmVyc29yX20zYmJsX3ApICU+JSANCiAgbGVmdF9qb2luKHByZWNpb3NfbWVjb24gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcHJlY2lvX21pX21lY29uX2Njbm5fY3J1ZG8gPSBwcmVjaW9fY3J1ZG9fbWlfdXNkX2JibCApKSAlPiUgDQogIGxlZnRfam9pbihpcGltX2Jhc2U5NCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBpcGltX25pdmVsX2dyYWxfOTQpLCBieSA9ICJhbmlvIikgJT4lIA0KICByZW5hbWUocmVnYWxpYXMgPSBwcmVjaW9fbWlfcmVnYWxpYXNfY3J1ZG8sDQogICAgICAgICBtZWNvbiA9IHByZWNpb19taV9tZWNvbl9jcnVkbywNCiAgICAgICAgIHlwZiA9IHByZWNpb19taV95cGZfY3J1ZG8sDQogICAgICAgICBpZGVlID0gcHJlY2lvX21pX2lkZWVfY3J1ZG8sDQogICAgICAgICBtZWNvbl9jY25uID0gcHJlY2lvX21pX21lY29uX2Njbm5fY3J1ZG8pICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogIHVuZ3JvdXAoKQ0KcHJlY2lvX21pX2NydWRvIDwtICBwcmVjaW9fbWlfY3J1ZG8gJT4lIA0KICBtdXRhdGUoIHVuaWRhZCA9ICJ1c2QvYmFycmlsZXMiLA0KICAgICAgICAgICB2YXJpYWJsZSA9ICAiUHJlY2lvIGRlbCBtZXJjYWRvIGludGVybm8gZGVsIHBldHLDs2xlbyBjcnVkbyBzZWfDum4gZGlzdGludGFzIGZ1ZW50ZXMiLA0KICAgICAgICAgIG1lY29uX2VzdGltYWRvID0gcHJlY2lvX21pX2NydWRvJG1lY29uW3ByZWNpb19taV9jcnVkbyRhbmlvPT0xOTk0XSppcGltX25pdmVsX2dyYWxfOTQsDQogICAgICAgICAgaW5kaWNlX3lwZl83MiA9IGdlbmVyYXJfaW5kaWNlKHNlcmllID0geXBmLCBmZWNoYSA9IGFuaW8sIGZlY2hhX2Jhc2UgPSAxOTcyKSwNCiAgICAgICAgIGlkZWVfZXN0aW1hZG8gPSBwcmVjaW9fbWlfY3J1ZG8kaWRlZVtwcmVjaW9fbWlfY3J1ZG8kYW5pbz09MTk3Ml0gKiBpbmRpY2VfeXBmXzcyLA0KICAgICAgICAgcHJlY2lvX2NydWRvX21kb2ludCA9ICAgY2FzZV93aGVuKA0KICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTYzOjE5NjUgfiBpZGVlX2VzdGltYWRvLA0KICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTY2OjE5ODggfiBpZGVlLA0KICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTg5OjE5OTEgfiB5cGYsDQogICAgICAgICAgICAgICAgYW5pbyA9PSAxOTkyIH4gbWVjb25fZXN0aW1hZG8sDQogICAgICAgICAgICAgICAgYW5pbyA+MTk5MiB+IG1lY29uKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCB2YXJpYWJsZSwgcHJlY2lvX2NydWRvX21kb2ludCAsIGV2ZXJ5dGhpbmcoLiksIA0KICAgICAgICAgLWMoaXBpbV9uaXZlbF9ncmFsXzk0LCBpZGVlX2VzdGltYWRvLG1lY29uX2VzdGltYWRvLGluZGljZV95cGZfNzIsaWRlZV9lc3RpbWFkbyApKSAlPiUgDQogIGZpbHRlcihhbmlvIDwgMjAyMSkNCg0KICANCiAgDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvX21pX2NydWRvLCBwYXRoID0gInJlc3VsdGFkb3MvcHJlY2lvX21pX2NydWRvLnhsc3giKQ0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvX21pX3ZzX2ludGVybmFjaW9uYWxfaWRlZV9jcnVkbyAlPiUgDQojICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHByZWNpb19jcnVkb19uZXVxdWluYV90Y19vZmljaWFsICkgJT4lIA0KIyAgICAgICAgICAgICAgICAgICAgICAgc3ByZWFkKC4sDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gYW5pbywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHByZWNpb19jcnVkb19uZXVxdWluYV90Y19vZmljaWFsKSAlPiUgDQojICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUodmFyaWFibGUgPSAicHJlY2lvX2NydWRvX25ldXF1aW5hX3RjX29maWNpYWwgZW4gdXNkL20zIikgJT4lDQojICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QodmFyaWFibGUsIGV2ZXJ5dGhpbmcoLikpLA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicHJlY2lvX21pX3ZzX2ludGVybmFjaW9uYWxfaWRlZV9jcnVkby54bHN4IikNCmBgYA0KDQo8YnI+DQoqKlRhYmxhIDMuIFByZWNpbyBkZWwgbWVyY2FkbyBpbnRlcm5vIGRlbCBwZXRyw7NsZW8gY3J1ZG8gZW4gQXJnZW50aW5hIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyAoYmFycmlsZXMpKioNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwcmVjaW9fbWlfY3J1ZG8gJT4lIA0KICBzZWxlY3QoLXByZWNpb19jcnVkb19tZG9pbnQpDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3RseShwcmVjaW9fbWlfY3J1ZG8gJT4lIA0KICAgICAgc2VsZWN0KC1wcmVjaW9fY3J1ZG9fbWRvaW50KSAlPiUgDQogICAgICBtdXRhdGUocmVnYWxpYXMgPSANCiAgICAgICAgICAgICAgIGNhc2Vfd2hlbihyZWdhbGlhcyA9PSAwIH4gTkFfcmVhbF8sDQogICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiByZWdhbGlhcykpICU+JSANCiAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLCB2YWx1ZSA9IHZhbG9yLCA0Om5jb2woLikpICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSB2YXJpYWJsZSwgc2hhcGUgPSB2YXJpYWJsZSkpKw0KICBnZW9tX2xpbmUoYWxwaGEgPSAwLjgpKw0KICBsYWJzKHRpdGxlID0gIkdyw6FmaWNvIDMuIFByZWNpb3MgZGVsIG1lcmNhZG8gaW50ZXJubyBkZWwgcGV0csOzbGVvIGNydWRvLg0KICAgICAgIEFyZ2VudGluYSAoMTk2MyAtIDIwMjApIiwNCiAgICAgICB5ID0gInVzZC9iYXJyaWwiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KICAgICAgICAgICAgICAgICAgICAgDQpgYGANCg0KDQojIyMjIFByZWNpbyBNZXJjYWRvIEludGVybm8gZGUgR2FzIE5hdHVyYWwNCiogUHJlY2lvIE1lcmNhZG8gSW50ZXJubyBkZSBnYXM6DQogICsgMTk2MyAtIDE5NjkgJiAxOTg5IC0gMTk5MjogQW51YXJpbyBkZSBZUEYNCiAgKyAxOTcwIC0gMTk4ODogIEtvenVsaiB5IFBpc3RvbmVzaSAtIFJldmlzdGEgSURFRQ0KICArIDE5OTMgZW4gYWRlbGFudGU6IFNlY3JldGFyw61hIGRlIEVuZXJnw61hIC0gQmFzZSBSZWdhbMOtYXMNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI0FudWFyaW8gWVBGDQp2dGFzX3ByZWNpb19tZW1vX3lwZl9nYXMgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NZW1vcmlhIFlQRi92dGFzX3ZhbG9yX2NhbnRpZGFkX3ByZWNpb19nYXMueGxzeCIpICU+JSANCiAgICByZW5hbWUoY2FudF92ZW5kaWRhZCA9ICJtMyIsIHZhbG9yX3ZlbmRpZG8gPSAiJCIsIG1vbmVkYSA9ICJNb25lZGEiKSAlPiUgDQogIGxlZnRfam9pbih2dGFzX3ByZWNpb19tZW1vX3lwZl9jcnVkbyAlPiUgc2VsZWN0KGFuaW8sIG1vbmVkYSwgdGNjX2RpYyApKSAlPiUgDQogIG11dGF0ZShwcmVjaW9fbWlfeXBmX2dhc19tb25lZGFfb3JpZ2luYWwgPSAodmFsb3JfdmVuZGlkby9jYW50X3ZlbmRpZGFkKSAvIDEwMDAsDQogICAgICAgICBwcmVjaW9fbWlfdXNkX3lwZl9nYXMgPSBwcmVjaW9fbWlfeXBmX2dhc19tb25lZGFfb3JpZ2luYWwgLyB0Y2NfZGljLA0KICAgICAgICAgcHJlY2lvX21pX3lwZl9nYXMgPSBjYXNlX3doZW4oICNob21vZ2VuaXphbW9zIGxvcyBjYW1iaW9zIGRlIG1vbmVkYQ0KICAgICAgICAgICBtb25lZGEgPT0gIm0kbiIgfiBwcmVjaW9fbWlfeXBmX2dhc19tb25lZGFfb3JpZ2luYWwvY29udmVyc29yX3Blc29zJGBtJG5gICwNCiAgICAgICAgICAgbW9uZWRhID09ICIkbGV5IiB+IHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbC9jb252ZXJzb3JfcGVzb3MkYCRMZXlgLCANCiAgICAgICAgICAgbW9uZWRhID09ICIkYXJnIiB+IHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbC9jb252ZXJzb3JfcGVzb3MkYCRhYCwgDQogICAgICAgICAgIG1vbmVkYSA9PSAiQSIgfiBwcmVjaW9fbWlfeXBmX2dhc19tb25lZGFfb3JpZ2luYWwvY29udmVyc29yX3Blc29zJEEsDQogICAgICAgICAgIFQgfiBwcmVjaW9fbWlfeXBmX2dhc19tb25lZGFfb3JpZ2luYWwpLA0KICAgICAgICAgbW9uZWRhID0gImFycyIsDQogICAgICAgICB1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIikgJT4lICNhY2xhcmFtb3MgbGEgdW5pZGFkIG1vbmV0YXJpYSB5YSB0cmFuc2Zvcm1hZGENCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgbW9uZWRhLCB2YWxvcl92ZW5kaWRvLCBjYW50X3ZlbmRpZGFkLCANCiAgICAgICAgIHByZWNpb19taV95cGZfZ2FzLHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbCwgdGNjX2RpYywgcHJlY2lvX21pX3VzZF95cGZfZ2FzKQ0KDQojQW51YXJpbyBDb21idXN0aWJsZQ0KYW51YXJpb19kZV9jb21idXN0aWJsZSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0FudWFyaW8gQ29tYnVzdGlibGVzL2FudWFyaW8gZGUgY29tYnVzdGlibGUueGxzeCIpICU+JSANCiAgZmlsdGVyKG1lcmNhbmNpYSA9PSAiZ2FzX25hdHVyYWwiKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8gLCAgICAgbWVzLCAgICAgIHVuaWRhZCApICU+JSANCiAgc3VtbWFyaXNlKHByZWNpb19taV9hbnVhcmlvX2dhcyA9IG1lYW4odmFsb3IpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8gLCAgICAgICB1bmlkYWQgKSAlPiUgDQogIHN1bW1hcmlzZShwcmVjaW9fbWlfYW51YXJpb19nYXMgPSBtZWFuKHByZWNpb19taV9hbnVhcmlvX2dhcykpICU+JSANCiAgbXV0YXRlKHByZWNpb19taV9hbnVhcmlvX2dhcyA9IChwcmVjaW9fbWlfYW51YXJpb19nYXMvY29udmVyc29yX3Blc29zJEEpLzEwMDAsDQogICAgICAgICB1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIikNCg0KIyBCYXNlIE1FQ09ODQpwcmVjaW9zX2ludGVybm9zX21lY29uX2dhcyA8LSBoaWRyb2NhcmJ1cm9zX2Jhc2VfbWVjb24gJT4lIA0KICBmaWx0ZXIoaW5kaWNhZG9yID09IGxpc3RhX2ZpbHRyb1syXSwgDQogICAgICAgICBhY3RpdmlkYWRfcHJvZHVjdG9fbm9tYnJlID09ICJHYXMgbmF0dXJhbCIsDQogICAgICAgICBhbGNhbmNlX3RpcG8gPT0gIlBBSVMiKSAlPiUNCiAgbXV0YXRlKGFuaW8gPSB5ZWFyKGZlY2hhKSkgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShwcmVjaW9fbWlfbWVjb25fZ2FzID0gbWVhbih2YWxvcikpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiKQ0KDQoNCiMjIEJhc2UgcmVnYWxpYXMNCiN2YWxvcmVzIDkzIC0gOTgNCnByZWNpb19yZWdhbGlhc190b3RhbF9nYXMgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9QcmVjaW9zL3ByZWNpb19taV9nYXMueGxzeCIsDQogICAgc2hlZXQgPSAiamsiKSAlPiUgDQogIGZpbHRlcihhbmlvIDwgMTk5OSkgJT4lIA0KICBtdXRhdGUocHJlY2lvX3RvdGFsX2dhcyA9IHByZWNpb19taV9nYXMgKiAxMDAwLA0KICAgICAgICAgdW5pZGFkID0gImFycy9NaWxlcyBkZSBtMyIpICU+JSANCiAgc2VsZWN0KC1wcmVjaW9fbWlfZ2FzKQ0KDQojdmFsb3JlcyBwb3N0IDk5DQpwcmVjaW9fcmVnYWxpYXNfbWlfZ2FzIDwtIHJlYWRfZGVsaW0oIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmVnYWxpYXMvcHJlY2lvX21lcmNhZG9faW50ZXJub19nYXNfcmVnYWxpYXMuY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUNCiAgcmVuYW1lKGFuaW8gPSAiQcORTyIsDQogICAgICAgICBtZXMgPSAiTUVTIiwNCiAgICAgICAgIHRvdGFsX2N1ZW5jYSA9ICJUT1RBTCBDVUVOQ0EiKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIiwNCiAgICAgICAgIGFuaW8gPSBuYS5sb2NmKGFuaW8pKSAlPiUgDQogIHNlbGVjdChhbmlvLCBtZXMsIHVuaWRhZCwgIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgZ2F0aGVyKC4sDQogICAgICAgICBrZXkgPSAiY3VlbmNhIiwNCiAgICAgICAgIHZhbHVlID0gInZhbG9yIiwNCiAgICAgICAgIDQ6bmNvbCguKSkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSBnc3ViKCIsIiwgIiIsIHZhbG9yKSwNCiAgICAgICAgIHZhbG9yID0gYXMuZG91YmxlKHZhbG9yKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQsIGN1ZW5jYSkgJT4lIA0KICBzdW1tYXJpc2UocHJlY2lvX3Byb21lZGlvX2N1ZW5jYSA9IG1lYW4odmFsb3IpKSU+JSANCiAgbXV0YXRlKHRpcG9fcHJlY2lvID0gIm1lcmNhZG8gaW50ZXJubyIpICU+JSANCiAgZmlsdGVyKGN1ZW5jYSA9PSAidG90YWxfY3VlbmNhIiklPiUgICNxdWl0byBwcmVjaW8gcHJvbWVkaW8gZWxhYm9yYWRvIHBxIG5vIHNlIHVzYXLDoQ0KICBsZWZ0X2pvaW4ocHJlY2lvX3JlZ2FsaWFzX3RvdGFsX2dhcykgJT4lIA0KICBtdXRhdGUocHJlY2lvX21pX3JlZ2FsaWFzX2dhcyA9IGNhc2Vfd2hlbihhbmlvIDwgMTk5OSB+IHByZWNpb190b3RhbF9nYXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBwcmVjaW9fcHJvbWVkaW9fY3VlbmNhKSkgJT4lIA0KICBzZWxlY3QoLWMocHJlY2lvX3RvdGFsX2dhcywgcHJlY2lvX3Byb21lZGlvX2N1ZW5jYSkpDQoNCiNSZXZpc3RhIElERUUNCiNwcmVjaW8gdHJhbnNmZXJlbmNpYSwgcmVnYWxpYXMsIGNvbXBlbnNhY2lvbmVzLCBldGMgcHJvbWVkaW8gYW51YWwNCnByZWNpb19taV9pZGVlX2dhcyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgZ2FzIG5hdHVyYWwgeSBkZXJpdmFkb3MgMTk3MCAtIDE5ODgueGxzeCIsIA0KICAgIHNraXAgPSAxLCBzaGVldCA9IDIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX3RyYW5zZmVyZW5jaWEpICU+JSANCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY183MCkpICU+JQ0KICBtdXRhdGUocHJlY2lvX21pX2luZGV4YWRvX3Blc29zID0gcHJlY2lvX3RyYW5zZmVyZW5jaWEgKiBpcGNfNzAgLyBjb252ZXJzb3JfcGVzb3MkYCRMZXlgKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiAlPiUgc2VsZWN0KGFuaW8sIHRjYykgKSAlPiUgDQogIG11dGF0ZShwcmVjaW9fbWlfaW5kZXhhZG9fdXNkID0gcHJlY2lvX21pX2luZGV4YWRvX3Blc29zL3RjYyApICANCiAgIyBzZWxlY3QoLWModW5pZGFkLCBwcmVjaW9fdHJhbnNmZXJlbmNpYSkpDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcmVjaW9fbWlfaWRlZV9nYXMsIHBhdGggPSAicHJlY2lvX21pX2lkZWVfZ2FzLnhsc3giKQ0KDQojY29udmVyc29yIGRlIG1vbmVkYSANCiMgJT4lIA0KIyAgIG11dGF0ZShwcmVjaW9fdHJhbnNmZXJlbmNpYSA9IGNhc2Vfd2hlbigNCiMgICAgIGFuaW8gPCAxOTgzIH4gcHJlY2lvX3RyYW5zZmVyZW5jaWEvY29udmVyc29yX3Blc29zJGAkTGV5YCwNCiMgICAgIGFuaW8gPT0gMTk4MyB+IHByZWNpb190cmFuc2ZlcmVuY2lhIC8gY29udmVyc29yX3Blc29zJGAkYWAsDQojICAgICBhbmlvICVpbiUgMTk4MzoxOTkxIH4gcHJlY2lvX3RyYW5zZmVyZW5jaWEvY29udmVyc29yX3Blc29zJEEpKQ0KDQojTWVyZ2UNCnByZWNpb19taV9nYXMgPC0gcHJlY2lvX3JlZ2FsaWFzX21pX2dhcyAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19taV9yZWdhbGlhc19nYXMpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb3NfaW50ZXJub3NfbWVjb25fZ2FzKSAlPiUgDQogIGZ1bGxfam9pbih2dGFzX3ByZWNpb19tZW1vX3lwZl9nYXMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCAgcHJlY2lvX21pX3lwZl9nYXMgKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX21pX2lkZWVfZ2FzICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHByZWNpb19taV9pZGVlX2luZGV4YWRvID0gcHJlY2lvX21pX2luZGV4YWRvX3Blc29zKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJlY2lvX21pX2lkZWVfY3Rlc19wZXNvcyA9IHByZWNpb190cmFuc2ZlcmVuY2lhKSkgJT4lIA0KICBsZWZ0X2pvaW4oYW51YXJpb19kZV9jb21idXN0aWJsZSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvc19tZWNvbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvICwgcHJlY2lvX21pX21lY29uX2Njbm5fZ2FzID0gcHJlY2lvX2dhc19taV9wZXNvc19NbTMpKSAlPiUgDQogICMgbXV0YXRlKHByZWNpb19nYXNfbWRvaW50ID0gY2FzZV93aGVuKGFuaW8gPCAxOTg4IH4gcHJlY2lvX21pX3lwZl9nYXMsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA9PSAxOTg4IH4gIHByZWNpb19taV9pZGVlX2luZGV4YWRvLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTg5OjE5OTEgIH4gcHJlY2lvX21pX3lwZl9nYXMsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA9PSAxOTkyICB+IHByZWNpb19taV95cGZfZ2FzLzEwLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPiAxOTkyIH4gcHJlY2lvX21pX3JlZ2FsaWFzX2dhcyksDQogICMgICAgICAgIGRpZl95cGZfaWRlZSA9IHByZWNpb19taV95cGZfZ2FzL3ByZWNpb19taV9pZGVlX2luZGV4YWRvLTEgKSAlPiUNCiAgbXV0YXRlKHZhcmlhYmxlID0gIlByZWNpbyBkZWwgbWVyY2FkbyBpbnRlcm5vIGRlbCBnYXMgbmF0dXJhbCBzZWfDum4gZGlzdGludGFzIGZ1ZW50ZXMiLA0KICAgICAgICAgcHJlY2lvX2dhc19tZG9pbnQgPSBjYXNlX3doZW4oYW5pbyAlaW4lIDE5NjM6MTk2OXxhbmlvICVpbiUgMTk4OToxOTkxIH4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9fbWlfeXBmX2dhcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTcwOjE5ODggfiBwcmVjaW9fbWlfaWRlZV9pbmRleGFkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA9PSAxOTkyICB+IHByZWNpb19taV95cGZfZ2FzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID4gMTk5MiB+IHByZWNpb19taV9yZWdhbGlhc19nYXMpICkgJT4lIA0KICBhcnJhbmdlKGFuaW8pICU+JQ0KICBzZWxlY3QoYW5pbywgdW5pZGFkLHZhcmlhYmxlLCBwcmVjaW9fZ2FzX21kb2ludCwgZXZlcnl0aGluZyguKSApICU+JSANCiAgcmVuYW1lKHJlZ2FsaWFzID0gcHJlY2lvX21pX3JlZ2FsaWFzX2dhcywNCiAgICAgICAgIG1lY29uID0gcHJlY2lvX21pX21lY29uX2dhcywNCiAgICAgICAgIHlwZiA9IHByZWNpb19taV95cGZfZ2FzLA0KICAgICAgICAgaWRlZSA9IHByZWNpb19taV9pZGVlX2luZGV4YWRvLA0KICAgICAgICAgbWVjb25fY2NubiA9IHByZWNpb19taV9tZWNvbl9jY25uX2dhcywNCiAgICAgICAgIGFudWFyaW8gPSBwcmVjaW9fbWlfYW51YXJpb19nYXMpICU+JSANCiAgZmlsdGVyKGFuaW8gPCAyMDIxKQ0KDQojcHJlY2lvIGludGVybm8gZW4gTU1CVFUgcGVzb3MNCnByZWNpb19taV9nYXNfTU1CVFUgPC0gIHByZWNpb19taV9nYXMgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHNlbGVjdCgtYyh1bmlkYWQsIHZhcmlhYmxlKSkgJT4lIA0KICBtdXRhdGVfYWxsKCBmdW5jdGlvbih4KSB7Y29udmVyc29yX20zTU1CVFVfcCh4LzEwMDApfSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gImFycy9NTUJUVSIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCg0KI3ByZWNpbyBpbnRlcm5vIGVuIE1NQlRVIHVzZA0KcHJlY2lvX2ludGVybm9fZ2FzX21tYnR1X3VzZCA8LSBwcmVjaW9fbWlfZ2FzX01NQlRVICU+JQ0KICAjIHNlbGVjdCgtZGlmX3lwZl9pZGVlKSAlPiUgDQogIGdhdGhlcihrZXkgPSB0aXBvX3ByZWNpbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAzOm5jb2woLikpICU+JQ0KIGxlZnRfam9pbih0Y3BfYW51YWxfYiwgYnkgPSAiYW5pbyIpICU+JQ0KICBtdXRhdGUodmFsb3IgPSB2YWxvci8gdGNjLA0KICAgICAgICAgdW5pZGFkID0gInVzZC9NTUJUVSIpICU+JSANCiAgc2VsZWN0KC1jKHRjYyx0Y3AsIHNvYnJldmFsdWFjaW9uKSkgJT4lIA0KICBzcHJlYWQoa2V5ID0gdGlwb19wcmVjaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yKQ0KDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcmVjaW9fbWlfZ2FzLCBwYXRoID0gInJlc3VsdGFkb3MvcHJlY2lvX21pX2dhcy54bHN4IikNCg0KI3ByZWNpbyByZXZpc3RhIHRyYW5zcHVlc3RvDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvX21pX2lkZWVfZ2FzICU+JSANCiMgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgcHJlY2lvX3RyYW5zZmVyZW5jaWFfeXBmX2FfR0UgPXByZWNpb190cmFuc2ZlcmVuY2lhICkgJT4lIA0KIyAgICAgICAgICAgICAgICAgICAgICAgc3ByZWFkKC4sDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gYW5pbywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHByZWNpb190cmFuc2ZlcmVuY2lhX3lwZl9hX0dFKSAlPiUgDQojICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUodmFyaWFibGUgPSAicHJlY2lvX3RyYW5zZmVyZW5jaWFfeXBmX2FfR0UgZW4gcGVzb3MgZGUgMTk3MC8xMDAwIG0zIikgJT4lDQojICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QodmFyaWFibGUsIGV2ZXJ5dGhpbmcoLikpLA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicHJlY2lvX21pX2lkZWVfZ2FzLnhsc3giKQ0KDQojIGdyYWZfbWlfZ2FzIDwtIHByZWNpb19taV9pZGVlX2dhcyAlPiUgDQojICAgc2VsZWN0KGFuaW8sIHByZWNpb19taV9pbmRleGFkb19wZXNvcywgcHJlY2lvX21pX2luZGV4YWRvX3VzZCkgJT4lIA0KIyAgIGdhdGhlciguLA0KIyAgICAgICAgICBrZXkgPSB2YXJpYWJsZSAsDQojICAgICAgICAgIHZhbHVlID0gdmFsb3IsDQojICAgICAgICAgIDI6MykgJT4lDQojICAgZmlsdGVyKHZhcmlhYmxlID09InByZWNpb19taV9pbmRleGFkb191c2QiICkgJT4lIA0KIyAgIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdmFyaWFibGUpKSsNCiMgICBnZW9tX2xpbmUoKQ0KIyBncmFmX21pX2dhcw0KDQojIHByZWNpb19taV9nYXMgJT4lIA0KIyAgIGZpbHRlcihhbmlvID4gMjAwMCkgJT4lIA0KIyAgIHNlbGVjdChhbmlvLCBwcmVjaW9fZ2FzX21kb2ludCwgcHJlY2lvX21pX21lY29uX2Njbm5fZ2FzKQ0KYGBgDQoNCjxicj4NCioqVGFibGEgNC4gUHJlY2lvIGRlbCBtZXJjYWRvIGludGVybm8gZGVsIGdhcyBuYXR1cmFsIGVuIEFyZ2VudGluYSBzZWfDum4gZGlzdGludGFzIGZ1ZW50ZXMgKGJhcnJpbGVzKSoqDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcHJlY2lvX21pX2dhcyAlPiUgDQogIHNlbGVjdCgtcHJlY2lvX2dhc19tZG9pbnQpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ3JhZl9wcmVjaW9faW50ZXJub19nYXNfbW1idHUgPC0gcHJlY2lvX21pX2dhc19NTUJUVSAlPiUNCiAgIyBzZWxlY3QoLWMoZGlmX3lwZl9pZGVlLCBwcmVjaW9fZ2FzX21kb2ludCkpICU+JSANCiAgc2VsZWN0KC1jKCBwcmVjaW9fZ2FzX21kb2ludCkpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcHJlY2lvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDM6bmNvbCguKSkgJT4lDQogbGVmdF9qb2luKHRjcF9hbnVhbF9iLCBieSA9ICJhbmlvIikgJT4lDQogIG11dGF0ZSh2YWxvciA9IHZhbG9yLyB0Y2MpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBhbmlvLCB5ID0gdmFsb3IsIGNvbG9yID0gdGlwb19wcmVjaW8pKSsNCiAgZ2VvbV9saW5lKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogICMgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgbGFicyh0aXRsZSA9ICJHcsOhZmljbyBOwrA0LiBQcmVjaW8gZGVsIG1lcmNhZG8gaW50ZXJubyBkZWwgZ2FzIG5hdHVyYWwuDQogICAgICAgQXJnZW50aW5hICgxOTYzIC0gMjAxOCkiLCANCiAgICAgICB5ID0gInVzZC9NTUJUVSIpDQpnZ3Bsb3RseShncmFmX3ByZWNpb19pbnRlcm5vX2dhc19tbWJ0dSwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCmBgYA0KDQoNCiMjIFByZWNpb3MgZGUgUmVmZXJlbmNpYSBkZWwgTWVyY2FkbyBNdW5kaWFsDQpQcmVjaW9zIGRlIGV4cG9ydGFjacOzbiBkZXNkZSBBcmdlbnRpbmEsIGJlbmNobWFya3MgeSBQcmVjaW9zIGRlbCBtZXJjYWRvIGRlIEVFVVUgKHNvbG8gZ2FzLCBpbnRlcm5vcyB5IGRlIGV4cG8vaW1wbykNCg0KKiBbU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEtUmVnYWxpYXNdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9yZWdhbGlhcy1kZS1wZXRyb2xlby1jcnVkby1nYXMtbmF0dXJhbC1nbHAtZ2Fzb2xpbmEteS1jb25kZW5zYWRvKSkgKDIwMDYtaG95KQ0KKiBbTUVDT05dKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9wcmVjaW8tZGUtZXhwb3J0YWNpb24tZGUtcGV0cm9sZW8tY3J1ZG8pLiBTZXJpZSBjb3J0YSB5IHNpbiB0cmFuc2Zvcm1hY2lvbmVzDQoqIEVJQQ0KICArIFtCcmVudF0oaHR0cHM6Ly93d3cuZWlhLmdvdi9kbmF2L3BldC9oaXN0L1JCUlRFRC5odG0pICgxOTg3LWhveSkNCiAgKyBbV1RJXShodHRwczovL3d3dy5laWEuZ292L2RuYXYvcGV0L2hpc3Qvcnd0Y0QuaHRtKSAoMTk4Ni1ob3kpDQogICsgW0hlbnJ5IEh1Yl0oaHR0cHM6Ly93d3cuZWlhLmdvdi9kbmF2L25nL2hpc3Qvcm5nd2hoZGQuaHRtKSAoMTk5Ny1ob3kpDQogICsgW1ByZWNpbyBHYXMgZGUgQm9jYSBkZSBQb3pvIGVuIEVFVVVdKGh0dHBzOi8vd3d3LmVpYS5nb3YvZG5hdi9uZy9oaXN0L245MTkwdXMzQS5odG0pDQoqIFtJbmZsYXRpb24gRGF0YV0oaHR0cHM6Ly9pbmZsYXRpb25kYXRhLmNvbS9hcnRpY2xlcy9pbmZsYXRpb24tYWRqdXN0ZWQtcHJpY2VzL2hpc3RvcmljYWwtY3J1ZGUtb2lsLXByaWNlcy10YWJsZS8pICgxOTQ2LWhveSkNCiogW0V1cm9zdGF0XShodHRwczovL2VjLmV1cm9wYS5ldS9ldXJvc3RhdC93ZWIvZW5lcmd5L2RhdGEvZGF0YWJhc2UpDQoqIFJldmlzdGEgSURFRSAgIA0KICArIFByZWNpbyBkZSBJbXBvcnRhY2nDs24gZGUgZ2FzIG5hdHVyYWwgZGVzZGUgQm9saXZpYSAoMTk3MC0xOTg4KQ0KKiBbVU4gQ29tdHJhZGVdKGh0dHBzOi8vY29tdHJhZGUudW4ub3JnL2RhdGEvKQ0KICArIFByZWNpbyBkZSBFeHBvcnRhY2nDs24gZSBJbXBvcnRhY2nDs24gZGUgZ2FzIHkgY3J1ZG8gKGEgQm9saXZpYSB5IHByb21lZGlvIG11bmRpYWwpDQogICsgRWwgcHJlY2lvIGltcG8gYm9saXZpYSBkZSAgVU4gQ29tdHJhZGUgY2llcnJhLCBkYSB2YWxvcmVzIGNvaGVyZW50ZXMgcGVybyBubyBkZWJlcmlhLCBkYWRvIHF1ZSBsYSBjb252ZXJzacOzbiBkZWJlcmlhIHJlYWxpemFyc2UgbXVsdGlwbGljYW5kbyBlbCBwcmVjaW8gZW4gTW0zIHBvciAxMDAwIHkgYWjDrSByZWNpw6luIHJlYWxpemFyIGxhIGNvbnZlcnNpw7NuDQogIA0KDQojIyMjIFByZWNpb3MgZGUgUmVmZXJlbmNpYSBkZWwgQ3J1ZG8NCiogRnVlbnRlcyBzZWxlY2Npb25hZGFzIHBhcmEgcHJlY2lvX21lX2NydWRvOiANCiAgKyBlbnRyZSAxOTYyIHkgMTk5MjogcHJlY2lvIGRlIGV4cG9ydGFjacOzbiBhcmdlbnRpbmEgZGUgVU4gQ29tdHJhZGUgKGNsYXNpZmljYWNpw7NuIFNJVEMgYXMgcmVwb3J0ZWQpDQogICsgZW50cmUgMTk5My0yMDAxIHkgMjAwNC0yMDE0OiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGFyZ2VudGluYSBkZSBNZWNvbg0KICArIGVudHJlIDIwMDIgeSAyMDAzOiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGRlIEFyZ2VudGluYSBkZSBVTiBDb210cmFkZSAoQ2xhc2lmaWNhY2nDs24gSFMgYXMgcmVwb3J0ZWQpDQogICsgMjAxNCBlbiBhZGVsYW50ZTogcHJlY2lvIGRlIGV4cG9ydGFjacOzbiBhcmdlbnRpbmEgZGUgU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgKFJlZ2Fsw61hcykNCiAgKyBWYWxvcmVzIGZhbHRhbnRlcyBwcmV2aW9zIGEgMTk5MiAoMTk3MCAtIDE5ODUpOiBCcmVudCAoRnVlbnRlOiBJbmZsYXRpb24gRGF0YSkNCg0KDQoqKkZhbHRhIGNvbnN0cnVpciB1bmEgcGFyaWRhZCBkZSBleHBvL2ltcG8gY29uIGVsIGZsZXRlKioNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNCYXNlIHJlZ2FsaWFzDQpwcmVjaW9fbWVfcmVnYWxpYXNfY3J1ZG8gPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZWdhbGlhcy9wcmVjaW9fbWVyY2Fkb19leHRlcm5vX2NydWRvX3JlZ2FsaWFzLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lDQogIHJlbmFtZShhbmlvID0gIkHDkU8iLA0KICAgICAgICAgbWVzID0gIk1FUyIsDQogICAgICAgICB0b3RhbF90aXBvX2NydWRvID0gIlRPVEFMIFRJUE8gREUgQ1JVRE8iKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAidXNkL20zIiwNCiAgICAgICAgIGFuaW8gPSBuYS5sb2NmKGFuaW8pKSAlPiUNCiAgc2VsZWN0KGFuaW8sIG1lcywgdW5pZGFkLCB0b3RhbF90aXBvX2NydWRvLCBldmVyeXRoaW5nKC4pLCAtYyhCUkVOVCwgV1RJKSkgJT4lIA0KICBnYXRoZXIoLiwNCiAgICAgICAgIGtleSA9ICJ0aXBvX2NydWRvIiwNCiAgICAgICAgIHZhbHVlID0gInZhbG9yIiwNCiAgICAgICAgIDU6bmNvbCguKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQpICU+JQ0KICBzdW1tYXJpc2UocHJlY2lvX3RvdGFsX3RpcG9fY3J1ZG8gPSBtZWFuKHRvdGFsX3RpcG9fY3J1ZG8pKSAlPiUgDQogICAgICAgICAgICAjIHByZWNpb19wcm9tZWRpb190aXBvX2NydWRvID0gbWVhbih2YWxvcikpJT4lIA0KICBtdXRhdGUodGlwb19wcmVjaW8gPSAibWVyY2FkbyBleHRlcm5vIiwNCiAgICAgICAgIHByZWNpb190b3RhbF90aXBvX2NydWRvID0gY29udmVyc29yX20zYmJsX3AocHJlY2lvX3RvdGFsX3RpcG9fY3J1ZG8pLA0KICAgICAgICAgdW5pZGFkID0gInVzZC9iYXJyaWxlcyIpDQoNCiMgTWVjb24gTU9ESUZJQ0FSIA0KcHJlY2lvX2V4cG9ydGFjaW9uX2NydWRvIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvcHJlY2lvLWV4cG9ydGFjaW9uLWNydWRvLnhsc3giLCANCiAgICBza2lwID0gMikNCg0KI0lOREVDIENvbUV4DQpwcmVjaW9fZXhwb19pbmRlYyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSU5ERUMvQ29tRXgvcHJlY2lvX2FudWFsX3Byb21lZGlvX2V4cG9faGlkcm9faW5kZWMuY3N2IiwgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsICU+JSBzZWxlY3QoLVRDUCkpICAlPiUgDQogIG11dGF0ZSggcHJlY2lvX2V4cG9fZ2FzX2luZGVjID0gKHByZWNpb19leHBvX2dhc19pbmRlYykgKiBUQ0MsDQogICAgICAgICAgICAgICAgICAgICAgdW5pZGFkX2dhcyA9ICJhcnMvTWlsZXMgZGUgbTMiCSkNCiAgIyBtdXRhdGUocHJlY2lvX2V4cG9fZ2FzX2luZGVjID0gcHJlY2lvX2V4cG9fZ2FzX2luZGVjICogVENDLCANCiAgIyAgICAgICAgdW5pZGFkID0gY2FzZV93aGVuKHVuaWRhZCA9PSAidXNkL01pbGVzIGRlIG0zIiB+ICJhcnMvTWlsZXMgZGUgbTMiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHVuaWRhZCkpDQoNCiNVTiBDT01UUkFERQ0KZXhwb19jcnVkb191bmNvbXRyYWRlX2hzIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9VTiBDb210cmFkZS9leHBvX2NydWRvX3VuY29tdHJhZGVfaHMuY3N2IikgJT4lIA0KICBtdXRhdGUodW5pZGFkX3ByZWNpbyA9ICJ1c2QvYmFycmlsZXMiLA0KICAgICAgICAgdW5pZGFkX3ZhbG9yID0gInVzZCIsDQogICAgICAgICB1bmlkYWRfY2FudGlkYWQgPSAiYmFycmlsZXMiKSAlPiUgDQogIHJlbmFtZShhbmlvID0gUGVyaW9kLA0KICAgICAgICAgcHJlY2lvX2V4cG9fY29tdHJhZGVfaHNfY3J1ZG8gPSBleHBvX3ByZWNpb19iYmwsIA0KICAgICAgICAgZXhwb191c2RfY29tdHJhZGVfY3J1ZG8gPSAiVHJhZGUgVmFsdWUgKFVTJCkiKQ0KDQpleHBvX2NydWRvX3NpdGMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL1VOIENvbXRyYWRlL2V4cG9fY3J1ZG9fc2l0Yy5jc3YiKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfcHJlY2lvID0gInVzZC9iYXJyaWxlcyIsDQogICAgICAgICB1bmlkYWRfdmFsb3IgPSAidXNkIiwNCiAgICAgICAgIHVuaWRhZF9jYW50aWRhZCA9ICJiYXJyaWxlcyIpICU+JSANCiAgcmVuYW1lKGFuaW8gPSBQZXJpb2QsDQogICAgICAgICBwcmVjaW9fZXhwb19jb210cmFkZV9zaXRjX2NydWRvID0gZXhwb19wcmVjaW9fYmJsLCANCiAgICAgICAgIGV4cG9fdXNkX2NvbXRyYWRlX2NydWRvID0gIlRyYWRlIFZhbHVlIChVUyQpIikNCg0KI01lcmdlIGJhc2VzDQpwcmVjaW9fZXhwb19jcnVkbyA8LSBwcmVjaW9fbWVfcmVnYWxpYXNfY3J1ZG8gJT4lIA0KICByZW5hbWUocHJlY2lvX2V4cG9fcmVnYWxpYXNfY3J1ZG8gPSBwcmVjaW9fdG90YWxfdGlwb19jcnVkbykgJT4lIA0KICBzZWxlY3QoLXRpcG9fcHJlY2lvKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHByZWNpb19leHBvX21lY29uX2NydWRvID0gcHJlY2lvX2NydWRvX21lX3VzZF9iYmwgKSkgJT4lDQogIGxlZnRfam9pbihwcmVjaW9fZXhwb19pbmRlYyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgtYyhwcmVjaW9fZXhwb19nYXNfaW5kZWMsIHVuaWRhZF9nYXMpKSkgJT4lDQogIGxlZnRfam9pbihleHBvX2NydWRvX3VuY29tdHJhZGVfaHMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3ByZWNpbywgcHJlY2lvX2V4cG9fY29tdHJhZGVfaHNfY3J1ZG8pKSAlPiUgDQogIGZ1bGxfam9pbihleHBvX2NydWRvX3NpdGMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3ByZWNpbywgcHJlY2lvX2V4cG9fY29tdHJhZGVfc2l0Y19jcnVkbykpICU+JQ0KICBhcnJhbmdlKGFuaW8pICU+JSANCiAgIyBtdXRhdGUocHJlY2lvX2V4cG9fY3J1ZG8gPSBjYXNlX3doZW4oYW5pbyA8IDE5OTMgfiBwcmVjaW9fZXhwb19jb210cmFkZV9zaXRjX2NydWRvLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyAlaW4lIDE5OTM6MjAxNCB+IHByZWNpb19leHBvX21lY29uX2NydWRvLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDIwMTQgfiBwcmVjaW9fZXhwb19yZWdhbGlhc19jcnVkbykpICU+JSANCiAgIyBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fZXhwb19jcnVkbywgZXZlcnl0aGluZyguKSwgLVRDQykNCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSwgLVRDQykNCiMgcHJlY2lvX2V4cG9fY3J1ZG8NCg0KYGBgDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyMjIFByZWNpbyBSZWZlcmVuY2lhIE1lcmNhZG8gRXh0ZXJubyBDcnVkbw0KI0JyZW50DQpicmVudF9hIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUHJlY2lvcy9icmVudC54bHN4IiwgDQogICAgc2tpcCA9IDQpJT4lICANCiAgcmVuYW1lKGFuaW8gPSBZZWFyLCBicmVudF9ub21pbmFsID0gYE5vbWluYWwgUHJpY2VgLCBicmVudF9hZGp1c3RlZCA9IGBJbmZsYXRpb24gQWRqdXN0ZWQgUHJpY2VgKSAgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gInVzZC9iYXJyaWxlcyIsDQogICAgICAgICBhbmlvID0gYXMuZG91YmxlKGFuaW8pKSANCg0KDQpicmVudF9kYWlseSAgPC0gIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUHJlY2lvcy9SQlJURWQueGxzIiwgDQogICAgc2hlZXQgPSAiRGF0YSAxIiwgc2tpcCA9IDIpICU+JQ0KICByZW5hbWUoZmVjaGEgPSBEYXRlLCBicmVudF9zcG90ID0gYEV1cm9wZSBCcmVudCBTcG90IFByaWNlIEZPQiAoRG9sbGFycyBwZXIgQmFycmVsKWApICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJ1c2QvYmFycmlsZXMiLA0KICAgICAgICAgZmVjaGEgPSBhcy5EYXRlKGZlY2hhKSwgDQogICAgICAgICBhbmlvID0geWVhcihmZWNoYSkpIA0KDQpicmVudF9JRUEgIDwtICBicmVudF9kYWlseSAlPiUgDQogIGdyb3VwX2J5KHVuaWRhZCwgYW5pbykgJT4lIA0KICBzdW1tYXJpc2UoYnJlbnRfc3BvdCA9IG1lYW4oYnJlbnRfc3BvdCkpDQoNCmJyZW50IDwtIGJyZW50X2EgJT4lDQogIHNlbGVjdCgtYnJlbnRfYWRqdXN0ZWQpICU+JSANCiAgbGVmdF9qb2luKGJyZW50X0lFQSkgJT4lIA0KICBtdXRhdGUoZGlmID0gYnJlbnRfc3BvdC9icmVudF9ub21pbmFsIC0gMSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogIHJlbmFtZShicmVudF9pZWEgPSBicmVudF9zcG90LA0KICAgICAgICAgYnJlbnRfaGlzdG9yaWMgPSBicmVudF9ub21pbmFsKQ0KDQojV1RJIA0Kd3RpX0VJQV9kYWlseSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9FSUEvZGF0YS9SV1RDZC54bHMiLCANCiAgICBzaGVldCA9ICJEYXRhIDEiLCBza2lwID0gMikgJT4lIA0KICByZW5hbWUod3RpX2VpYSA9IGBDdXNoaW5nLCBPSyBXVEkgU3BvdCBQcmljZSBGT0IgKERvbGxhcnMgcGVyIEJhcnJlbClgICkgJT4lIA0KICBtdXRhdGUobWVzID0gbW9udGgoRGF0ZSksDQogICAgICAgICBhbmlvID0geWVhcihEYXRlKSwNCiAgICAgICAgIHVuaWRhZCA9ICJ1c2QvYmFycmlsZXMiKQ0KDQp3dGlfRUlBIDwtIHd0aV9FSUFfZGFpbHkgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQpICU+JSANCiAgc3VtbWFyaXNlKHd0aV9laWEgPSBtZWFuKHd0aV9laWEsIG5hLnJtID0gVCkpDQoNCnd0aV9mcmVkIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9GUkVEL1dUSVNQTEMuY3N2IikgICU+JQ0KICByZW5hbWUod3RpX3Nwb3RfcHJpY2UgPSBXVElTUExDKSAlPiUgDQogIG11dGF0ZShhbmlvID0geWVhcihEQVRFKSwNCiAgICAgICAgIHVuaWRhZCA9ICJ1c2QvYmFycmlsZXMiKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2Uod3RpX3Nwb3RfcHJpY2VfZnJlZCA9IG1lYW4od3RpX3Nwb3RfcHJpY2UpKQ0KICANCnd0aV9yZXRlbmNpb25fMDQgPC0gd3RpX0VJQV9kYWlseSAgJT4lIA0KICBmaWx0ZXIoYW5pbyA+IDIwMDMgKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIG1lcykgJT4lIA0KICBzdW1tYXJpc2Uod3RpID0gbWVhbih3dGlfZWlhKSkgJT4lIA0KICBtdXRhdGUocmV0ZW5jaW9uID0gY2FzZV93aGVuKHd0aSA8IDMyIH4gMC4yNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dGkgPj0gMzIgJiB3dGkgPCAzNC45OSB+IDAuMjgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3RpID49IDM1ICYgd3RpIDwgMzYuOTkgfiAwLjMxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0aSA+PSAzNyAmIHd0aSA8IDM4Ljk5IH4gMC4zNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dGkgPj0gMzkgJiB3dGkgPCA0MC45OSB+IDAuMzcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3RpID49IDQxICYgd3RpIDwgNDIuOTkgfiAwLjQwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0aSA+PSA0MyAmIHd0aSA8IDQ0Ljk5IH4gMC40MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dGkgPj0gNDUgfiAwLjQ1KSkgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShyZXRlbmNpb24gPSBtZWFuKHJldGVuY2lvbikpDQoNCg0Kd3RpX3JldGVuY2lvbl8wNyA8LSB3dGlfRUlBX2RhaWx5ICU+JSANCiAgZmlsdGVyKGFuaW8gJWluJSBjKCAyMDA3OjIwMTQpLCBEYXRlID4gIjIwMDctMTEtMDIiICkgJT4lIA0KICBtdXRhdGUocmV0ZW5jaW9uID0gY2FzZV93aGVuKHd0aV9laWEgPj0gNjAuOSB+ICh3dGlfZWlhIC0gNDIpLzQyICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dGlfZWlhIDwgNjAuOSB+IDAuNDUpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHd0aV9laWEgPSBtZWFuKHd0aV9laWEpLA0KICAgICAgICAgICAgcmV0ZW5jaW9uID0gIG1lYW4ocmV0ZW5jaW9uKSkNCg0KYnJlbnRfcmVudGVuY2lvbl8xNCA8LSAgYnJlbnRfZGFpbHkgJT4lDQogICBmaWx0ZXIoYW5pbyAlaW4lIGMoIDIwMTQ6MjAxNSksIGZlY2hhID4gIjIwMDctMTEtMDIiICkgJT4lDQogIG11dGF0ZShyZXRlbmNpb24gPSBjYXNlX3doZW4oYnJlbnRfc3BvdCA+PSA3MSB+IChicmVudF9zcG90IC0gNzApLzcwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZW50X3Nwb3QgPCA3MSB+IDAuMDEpKSAlPiUgDQogICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShicmVudF9zcG90ID0gbWVhbihicmVudF9zcG90KSwNCiAgICAgICAgICAgIHJldGVuY2lvbiA9ICBtZWFuKHJldGVuY2lvbikpDQogIA0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNQcmVjaW8gZGUgZXhwb3J0YWNpb24geSByZWZlcmVuY2lhLiBNZXJnZSBkZSBiYXNlcw0KcHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyA8LSAgcHJlY2lvX2V4cG9fY3J1ZG8gICU+JSAgIA0KICBmdWxsX2pvaW4oYnJlbnQgJT4lIHNlbGVjdCgtZGlmKSkgJT4lIA0KICBsZWZ0X2pvaW4od3RpX0VJQSApICU+JSANCiAgZnVsbF9qb2luKHd0aV9mcmVkKSAlPiUgDQogIG11dGF0ZShwcmVjaW9fZXhwb19jcnVkb19pbmRlYyA9IGNhc2Vfd2hlbihwcmVjaW9fZXhwb19jcnVkb19pbmRlYyA+IDMwMCB+IE5BX3JlYWxfLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHByZWNpb19leHBvX2NydWRvX2luZGVjKSwNCiAgICAgICAgIHByZWNpb19tZV9jcnVkbyA9IGNhc2Vfd2hlbihhbmlvICVpbiUgMTk5MzoyMDAxIHwgYW5pbyAlaW4lIDIwMDQ6MjAxNCB+IHByZWNpb19leHBvX21lY29uX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gJWluJSAyMDAyOjIwMDMgfiBwcmVjaW9fZXhwb19jb210cmFkZV9oc19jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID4gMjAxNCB+IHByZWNpb19leHBvX3JlZ2FsaWFzX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKHByZWNpb19leHBvX2NvbXRyYWRlX3NpdGNfY3J1ZG8pIH4gYnJlbnRfaGlzdG9yaWMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA8IDE5OTMgfiBwcmVjaW9fZXhwb19jb210cmFkZV9zaXRjX2NydWRvKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fbWVfY3J1ZG8sIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogIGZpbHRlcihhbmlvIDwgMjAyMSkNCg0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbywgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL3ByZWNpb19leHBvX3lfbWRvX211bmRpYWxfY3J1ZG8ueGxzeCIpDQpwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvICU+JSANCiAgc2VsZWN0KC1wcmVjaW9fbWVfY3J1ZG8pDQoNCg0KZ3JhZl9wcmVjaW9fbWRvX211bmRpYWxfY3J1ZG8gPC0gcHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyAlPiUgDQogIHNlbGVjdCgtcHJlY2lvX21lX2NydWRvKSAlPiUgDQogIGdhdGhlcihrZXkgPSB0aXBvX3ByZWNpbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAzOm5jb2woLikpICU+JQ0KICAjIGZpbHRlcighKHRpcG9fcHJlY2lvICVpbiUgYygicHJlY2lvX2dhc19ib2xpdmlhX3VzZF9pZGVlIiwgInByZWNpb19pbXBvX2dhc19ib2xpdmlhX01NQlRVX2NvbXRyYWRlIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZWNpb19leHBvX2dhc19jb210cmFkZSIsICJwcmVjaW9fZXhwb19nYXNfaW5kZWMiKSkpICU+JQ0KICAjIGZpbHRlcihhbmlvICE9IDIwMDIgJiB0aXBvX3ByZWNpbyAhPSAicHJlY2lvX2V4cG9fY3J1ZG9faW5kZWMiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gYW5pbywgeSA9IHZhbG9yLCBjb2xvciA9IHRpcG9fcHJlY2lvKSkrDQogIGdlb21fbGluZShhbHBoYSA9IDAuOSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiUHJlY2lvcyBkZSBleHBvcnRhY2nDs24geSByZWZlcmVuY2lhIGRlbCBtZXJjYWRvIG11bmRpYWwgZGVsIGNydWRvIiwgDQogICAgICAgeSA9ICJ1c2QvYmFycmlsZXMiKQ0KDQpnZ3Bsb3RseShncmFmX3ByZWNpb19tZG9fbXVuZGlhbF9jcnVkbywgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCg0KYGBgDQoNCiMjIyMgUHJlY2lvcyBkZSBSZWZlcmVuY2lhIGRlbCBHYXMNCg0KKiBDcml0ZXJpbyBkZSBwcmVjaW9fZXh0ZXJub19nYXM6DQogICsgQcOxb3MgMTk2NCB5IDE5NjU6IFByZWNpbyBkZSBpbXBvcnRhY2nDs24gZGUgZ2FzIHByb3ZlbmllbnRlIGRlIEJvbGl2aWEgaGFjaWEgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlDQogICsgMTk2NiBlbiBhZGVsYW50ZTogUHJlY2lvIGRlIGV4cG9ydGFjaW9uIGRlIGdhcyBkZXNkZSBCb2xpdmlhIGEgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlDQogICsgRGF0b3MgZmFsdGFudGVzIHBhcmEgbG9zIGHDsW9zIHByZXZpb3MgYSAxOTYzIHkgcGVyw61vZG8gMTk2OC0xOTcxDQoNCiMjIyMjIEV4cG9ydGFjacOzbiBBcmdlbnRpbmENCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMjIyBQcmVjaW8gZGUgRXhwb3J0YWNpw7NuIGRlbCBHYXMgDQojcmVnYWxpYXMNCnByZWNpb19leHBvX3JlZ2FsaWFzX2dhcyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JlZ2FsaWFzL3ByZWNpb19tZXJjYWRvX2V4dGVybm9fZ2FzX3JlZ2FsaWFzLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lDQogICByZW5hbWUoYW5pbyA9ICJBw5FPIiwNCiAgICAgICAgIG1lcyA9ICJNRVMiLA0KICAgICAgICAgdG90YWxfY3VlbmNhID0gIlRPVEFMIENVRU5DQSIpICU+JSANCiAgIG11dGF0ZSh1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIiwNCiAgICAgICAgICBhbmlvID0gbmEubG9jZihhbmlvKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgbWVzLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgZ2F0aGVyKC4sDQogICAgICAgICBrZXkgPSAiY3VlbmNhIiwNCiAgICAgICAgIHZhbHVlID0gInZhbG9yIiwNCiAgICAgICAgIDQ6bmNvbCguKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQsIGN1ZW5jYSkgJT4lDQogIG11dGF0ZSh2YWxvciA9IGdzdWIoIiwiLCAiIiwgdmFsb3IpLA0KICAgICAgICAgdmFsb3IgPSBhcy5kb3VibGUodmFsb3IpKSAlPiUgIA0KICBzdW1tYXJpc2UocHJlY2lvX2V4cG9fZ2FzX3JlZ2FsaWFzID0gbWVhbih2YWxvciwgbmEucm0gPSBUKSkgJT4lIA0KICBtdXRhdGUodGlwb19wcmVjaW8gPSAibWVyY2FkbyBleHRlcm5vIikgJT4lDQogIGZpbHRlcihjdWVuY2EgPT0gInRvdGFsX2N1ZW5jYSIpJT4lDQogIGFycmFuZ2UoYW5pbykNCg0KI2NvbXRyYWRlDQpleHBvX2dhc19jb210cmFkZSA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvVU4gQ29tdHJhZGUvcmVzdWx0YWRvcy9leHBvX2dhc19zaXRjLmNzdiIpICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iICU+JSBzZWxlY3QoYW5pbywgdGNjKSkgJT4lIA0KICBtdXRhdGUoZXhwb19wcmVjaW9fTU1CVFUgPSBjb252ZXJzb3JfbTNNTUJUVV9wKGV4cG9fcHJlY2lvX01tMyApLA0KICAgICAgICAgZXhwb19wcmVjaW9fTW0zX2FycyA9IGV4cG9fcHJlY2lvX01tMyAqIHRjYykgDQoNCiNtZXJnZSBkZSBiYXNlcw0KI3ByZWNpbyBlbiBwZXNvcw0KcHJlY2lvX2V4cG9fZ2FzIDwtIGV4cG9fZ2FzX2NvbXRyYWRlICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19leHBvX2dhc19jb210cmFkZSA9IGV4cG9fcHJlY2lvX01tM19hcnMpICU+JSANCiAgZnVsbF9qb2luKHByZWNpb19leHBvX3JlZ2FsaWFzX2dhcyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgtYyhjdWVuY2EsIHRpcG9fcHJlY2lvKSkpICU+JQ0KICBsZWZ0X2pvaW4ocHJlY2lvX2V4cG9faW5kZWMgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfZ2FzLCBwcmVjaW9fZXhwb19nYXNfaW5kZWMpICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKCEoaXMubmEocHJlY2lvX2V4cG9fZ2FzX2luZGVjKSkpKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHByZWNpb19leHBvX2dhc19tZWNvbiA9IHByZWNpb19nYXNfbWVfcGVzb3NfTW0zKSkNCg0KDQojcHJlY2lvcyBlbiBkb2xhcmVzDQpwcmVjaW9fZXhwb19nYXNfdXNkIDwtIGV4cG9fZ2FzX2NvbXRyYWRlICAlPiUgIA0KICBzZWxlY3QoYW5pbywgIHByZWNpb19leHBvX2dhc19jb210cmFkZSA9IGV4cG9fcHJlY2lvX01NQlRVKSAlPiUNCiAgbGVmdF9qb2luKCBwcmVjaW9fZXhwb19nYXMgJT4lIHNlbGVjdCgtYyhwcmVjaW9fZXhwb19nYXNfY29tdHJhZGUsIHVuaWRhZCkpLCBieSA9ICJhbmlvIikgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsICU+JSBzZWxlY3QoLVRDUCkpICU+JQ0KICBtdXRhdGUocHJlY2lvX2V4cG9fZ2FzX3JlZ2FsaWFzID0gKHByZWNpb19leHBvX2dhc19yZWdhbGlhcy8xMDAwKSAvIFRDQywgDQogICAgICAgICBwcmVjaW9fZXhwb19nYXNfaW5kZWMgPSAocHJlY2lvX2V4cG9fZ2FzX2luZGVjICkvIFRDQywgDQogICAgICAgICBwcmVjaW9fZXhwb19nYXNfbWVjb24gPSAocHJlY2lvX2V4cG9fZ2FzX21lY29uLzEwMDApLyBUQ0MsDQogICAgICAgICB1bmlkYWQgPSAidXNkL01NQlRVIikgJT4lIA0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcmVjaW9fZXhwb19nYXNfcmVnYWxpYXMiLCAicHJlY2lvX2V4cG9fZ2FzX2luZGVjIiwgInByZWNpb19leHBvX2dhc19tZWNvbiIpLA0KICAgICAgICAgICAgLmZ1bnMgPSBjb252ZXJzb3JfbTNNTUJUVV9wKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLiksLVRDQykNCg0KDQpgYGANCg0KIyMjIyMgUmVmZXJlbmNpYXMgbXVuZGlhbGVzDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgUHJlY2lvIFJlZmVyZW5jaWEgTWVyY2FkbyBFeHRlcm5vIEdhcyANCiMjIyMgUHJlY2lvcyBNdW5kaWFsZXMNCiNoZW5yeV9odWIgRUlBDQpoZW5yeV9odWIgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9QcmVjaW9zL1JOR1dISERkLnhscyIsIA0KICAgIHNoZWV0ID0gIkRhdGEgMSIsIHNraXAgPSAyKSAlPiUgDQogIHJlbmFtZSggZGF0ZSA9IERhdGUsDQogICAgaGVucnlfaHViX3Nwb3QgPSBgSGVucnkgSHViIE5hdHVyYWwgR2FzIFNwb3QgUHJpY2UgKERvbGxhcnMgcGVyIE1pbGxpb24gQnR1KWApICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJ1c2QvTU1CVFUiLA0KICAgICAgICAgYW5pbyA9IHllYXIoZGF0ZSkpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkKSAlPiUgDQogIHN1bW1hcmlzZShlaWFfaGVucnlfaHViX3Nwb3QgPSBtZWFuKGhlbnJ5X2h1Yl9zcG90LCBuYS5ybSA9IFQpKSANCg0KaGVucnlfaHViX2FycyA8LSAgaGVucnlfaHViICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBUQ0MpKSAlPiUgDQogIG11dGF0ZShoZW5yeV9odWJfc3BvdCA9IGNvbnZlcnNvcl9NTUJUVW0zZ2FzX3AoZWlhX2hlbnJ5X2h1Yl9zcG90ICoxMDAwKlRDQyksDQogICAgICAgICB1bmlkYWQ9ICJhcnMvTWlsZXMgZGUgbTMiKQ0KDQojIFByZWNpbyBVU0EgYm9jYSBkZSBwb3pvIEVJQSAgICAgICAgICB1bmlkYWQgPSAidXNkL2Z0MyINCndlbGxoZWFkX3ByaWNlX2VldXUgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvRUlBL2RhdGEvbmF0dXJhbF9nYXNfd2VsbGhlYWRfcHJpY2VfZWV1dS54bHMiLCANCiAgICBzaGVldCA9ICJEYXRhIDEiLCBza2lwID0gMikgJT4lIA0KICByZW5hbWUodXNfd2VsbGhlYWRfcHJpY2VfZnQzID0gIlUuUy4gTmF0dXJhbCBHYXMgV2VsbGhlYWQgUHJpY2UgKERvbGxhcnMgcGVyIFRob3VzYW5kIEN1YmljIEZlZXQpIikgJT4lICANCiAgbXV0YXRlKCB1c193ZWxsaGVhZF9wcmljZV9NbTMgPSBjb252ZXJzb3JfZnQzbTNfcCh1c193ZWxsaGVhZF9wcmljZV9mdDMqMTAwMCksDQogICAgICAgICAgdXNfd2VsbGhlYWRfcHJpY2VfTU1CVFUgPSBjb252ZXJzb3JfZnQzTU1CVFVfcCh1c193ZWxsaGVhZF9wcmljZV9mdDMvMTAwMCksDQogICAgICAgICAgYW5pbyA9IHllYXIoRGF0ZSksDQogICAgICAgICB1bmlkYWQgID0gInVzZCIpIA0KDQojb3Ryb3MgcHJlY2lvcyBkZSBVU0EgRUlBDQpwcmljZV9lZXV1IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0VJQS9kYXRhL25hdHVyYWxfZ2FzX3ByaWNlc191c2EueGxzIiwgDQogICAgc2hlZXQgPSAiRGF0YSAxIiwgc2tpcCA9IDIpICU+JSANCiAgcmVuYW1lKHVzX3dlbGxoZWFkX2dhc19wcmljZSA9IGBVLlMuIE5hdHVyYWwgR2FzIFdlbGxoZWFkIFByaWNlIChEb2xsYXJzIHBlciBUaG91c2FuZCBDdWJpYyBGZWV0KWAsDQogICAgICAgICB1c19pbXBvcnRfZ2FzX3ByaWNlID0gYFByaWNlIG9mIFUuUy4gTmF0dXJhbCBHYXMgSW1wb3J0cyAoRG9sbGFycyBwZXIgVGhvdXNhbmQgQ3ViaWMgRmVldClgLA0KICAgICAgICAgdXNfcGlwZWxpbmVfaW1wb3J0X3ByaWNlID0gYFUuUy4gTmF0dXJhbCBHYXMgUGlwZWxpbmUgSW1wb3J0cyBQcmljZSAoRG9sbGFycyBwZXIgVGhvdXNhbmQgQ3ViaWMgRmVldClgLA0KICAgICAgICAgdXNfbG5nX2ltcG9ydF9wcmljZSA9IGBQcmljZSBvZiBVLlMuIE5hdHVyYWwgR2FzIExORyBJbXBvcnRzIChEb2xsYXJzIHBlciBUaG91c2FuZCBDdWJpYyBGZWV0KWAsDQogICAgICAgICB1c19leHBvcnRfZ2FzX3ByaWNlID0gYFByaWNlIG9mIFUuUy4gTmF0dXJhbCBHYXMgRXhwb3J0cyAoRG9sbGFycyBwZXIgVGhvdXNhbmQgQ3ViaWMgRmVldClgLA0KICAgICAgICAgdXNfZXhwb3J0X2dhc19waXBlbGluZV9wcmljZSA9IGBQcmljZSBvZiBVLlMuIE5hdHVyYWwgR2FzIFBpcGVsaW5lIEV4cG9ydHMgKERvbGxhcnMgcGVyIFRob3VzYW5kIEN1YmljIEZlZXQpYCwNCiAgICAgICAgIHVzX2V4cG9ydF9sbmdfcHJpY2UgPSBgUHJpY2Ugb2YgTGlxdWVmaWVkIFUuUy4gTmF0dXJhbCBHYXMgRXhwb3J0cyAoRG9sbGFycyBwZXIgVGhvdXNhbmQgQ3ViaWMgRmVldClgKSAlPiUgDQogIHNlbGVjdCh1c193ZWxsaGVhZF9nYXNfcHJpY2UsIHVzX2ltcG9ydF9nYXNfcHJpY2UsIHVzX3BpcGVsaW5lX2ltcG9ydF9wcmljZSwNCiAgICAgICAgdXNfbG5nX2ltcG9ydF9wcmljZSwgdXNfZXhwb3J0X2dhc19wcmljZSwNCiAgICAgICAgdXNfZXhwb3J0X2dhc19waXBlbGluZV9wcmljZSwgdXNfZXhwb3J0X2xuZ19wcmljZSApICU+JSANCiAgbXV0YXRlKGFuaW8gPSAxOTIyOjIwMTkpDQogIA0KDQpwcmljZV9lZXV1X01tMyA8LSAgcHJpY2VfZWV1dSAlPiUgDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCl7Y29udmVyc29yX2Z0M20zX3AoIDEwMDApfSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDE5MjI6MjAxOSwNCiAgICAgICAgIHVuaWRhZCA9ICJ1c2QvTWlsZXMgZGUgbTMiKSANCg0KcHJpY2VfZWV1dV9NTUJUVSA8LSAgcHJpY2VfZWV1dSAlPiUgDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCl7Y29udmVyc29yX2Z0M01NQlRVX3AoeCAvMTAwMCl9KSAlPiUgDQogIG11dGF0ZShhbmlvID0gMTkyMjoyMDE5LA0KICAgICAgICAgdW5pZGFkID0gInVzZC9NTUJUVSIpICAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLikpDQogIA0KDQojZXVyb3N0YXQNCg0KDQojQlANCmJwX2dhc19wcmljZXMgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvQlAvYnAtc3RhdHMtcmV2aWV3LTIwMjAtYWxsLWRhdGEueGxzeCIsIA0KICAgIHNoZWV0ID0gIkdhcyAtIFByaWNlcyAiLCBza2lwID0gMykgJT4lIA0KICByZW5hbWUoYW5pbyA9IC4uLjEsIA0KICAgICAgICAgYnBfbG5nX2phcGFuX2NpZiA9IEphcGFuLA0KICAgICAgICAgYnBfbG5nX2prbSA9ICJKYXBhbiBLb3JlYSBNYXJrZXIiLA0KICAgICAgICAgYnBfZ2FzX2dlcm1hbl9pbXBvcnRfcHJpY2UgPSAiQXZlcmFnZSBHZXJtYW4iLA0KICAgICAgICAgYnBfZ2FzX25icCA9IFVLLA0KICAgICAgICAgYnBfZ2FzX25ldGhlcmxhbmRzX3R0ZiA9ICJOZXRoZXJsYW5kcyBUVEYiLA0KICAgICAgICAgYnBfZ2FzX2hlbnJ5X2h1YiA9IFVTLA0KICAgICAgICAgYnBfZ2FzX2NhbmFkYSA9IENhbmFkYSwgDQogICAgICAgICBicF9vaWxfbWl4X21lYW5fb2VjZCA9IE9FQ0QpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpICU+JSANCiAgZmlsdGVyKCFpcy5uYShhbmlvKSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gInVzZC9NTUJUVSIpDQoNCmJwX2dhc18yMDE2IDwtIGJwX2dhc19wcmljZXMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgYnBfbG5nX2prbSwgYnBfZ2FzX2hlbnJ5X2h1YiwgYnBfZ2FzX25ldGhlcmxhbmRzX3R0ZiApICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKGFuaW8gPT0gMjAxNikNCg0KDQojRk1JDQpmbWlfcHJpY2VzIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9GTUkvUENQU18wOS0xNi0yMDIwIDE1LTA3LTEwLTY2X3RpbWVTZXJpZXMuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhYMzggPSBjb2xfc2tpcCgpKSkNCg0KZm1pX2dhc19wcmljZSA8LSBmbWlfcHJpY2VzICU+JSANCiAgZmlsdGVyKGBDb21tb2RpdHkgTmFtZWAgJWluJSBjKCJOYXR1cmFsIGdhcywgRVUiLCJOYXR1cmFsIEdhcywgVVMgSGVucnkgSHViIEdhcyIsIkxORywgQXNpYSIgICksDQogICAgICAgICBgVW5pdCBOYW1lYCA9PSAiSW5kZXgiKSAlPiUgDQogIHJlbmFtZShjb21tb2RpdHkgPSAiQ29tbW9kaXR5IE5hbWUiLA0KICAgICAgICAgdW5pZGFkID0gIlVuaXQgTmFtZSIpICU+JSANCiAgZ2F0aGVyKC4sDQogICAgICAgICBrZXkgPSBhbmlvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwgDQogICAgICAgICAgIDg6bmNvbCguKSkgJT4lIA0KICBzZWxlY3QoY29tbW9kaXR5LCBhbmlvLCB2YWxvciwgdW5pZGFkICkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSB2YWxvciAvIDEwMCwNCiAgICAgICAgIGFuaW8gPSBhcy5kb3VibGUoYW5pbykpICU+JSANCiAgc3ByZWFkKC4sDQogICAgICAgICBrZXkgPSBjb21tb2RpdHksIA0KICAgICAgICAgdmFsdWUgPSB2YWxvcikgJT4lIA0KICByZW5hbWUoZm1pX2xuZ19hc2lhID0gIkxORywgQXNpYSIsDQogICAgICAgICBmbWlfbmF0dXJhbF9nYXNfZXUgPSJOYXR1cmFsIGdhcywgRVUiLA0KICAgICAgICAgZm1pX2hlbnJ5X2h1YiA9ICJOYXR1cmFsIEdhcywgVVMgSGVucnkgSHViIEdhcyIpICU+JSANCiAgbXV0YXRlKGZtaV9sbmdfYXNpYSA9IGZtaV9sbmdfYXNpYSAqIGJwX2dhc18yMDE2JGJwX2xuZ19qa20sDQogICAgICAgICBmbWlfaGVucnlfaHViID0gIGZtaV9oZW5yeV9odWIgKiBicF9nYXNfMjAxNiRicF9nYXNfaGVucnlfaHViLA0KICAgICAgICAgZm1pX25hdHVyYWxfZ2FzX2V1ID0gZm1pX25hdHVyYWxfZ2FzX2V1ICogYnBfZ2FzXzIwMTYkYnBfZ2FzX25ldGhlcmxhbmRzX3R0ZiwNCiAgICAgICAgIHVuaWRhZCA9ICJ1c2QvTU1CVFUiKQ0KDQoNCiMgdW5pcXVlKGZtaV9wcmljZXMkYENvbW1vZGl0eSBOYW1lYCkNCiMgdW5pcXVlKGZtaV9wcmljZXMkYFVuaXQgTmFtZWApDQojIHVuaXF1ZShmbWlfcHJpY2VzJGBDb3VudHJ5IE5hbWVgKQ0KYGBgDQoNCg0KIyMjIyMgQm9saXZpYQ0KIA0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KIyMjIyBQcmVjaW8gZGUgaW1wb3J0YWNpw7NuIGRlIEJvbGl2aWENCiNQcmVjaW8gaW1wbyBib2xpdmlhIHJldmlzdGEgSURFRQ0KcHJlY2lvX2lkZWVfaW1wb19nYXMgPC0gY3VhZHJvXzQuMyAgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX2dhcywgcHJlY2lvX2dhc19ib2xpdmlhKSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfNzApKSAlPiUNCiAgbXV0YXRlKHByZWNpb19nYXNfYm9saXZpYV9pZGVlID0gcHJlY2lvX2dhc19ib2xpdmlhICogaXBjXzcwIC8gY29udmVyc29yX3Blc29zJGAkTGV5YCwNCiAgICAgICAgIHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiAlPiUgc2VsZWN0KGFuaW8sIHRjYykpICU+JSANCiAgbXV0YXRlKHByZWNpb19nYXNfYm9saXZpYV91c2RfaWRlZSA9IHByZWNpb19nYXNfYm9saXZpYV9pZGVlIC90Y2MpDQoNCg0KI3ByZWNpbyBCb2xpdmlhIFlQRkIgZW4gdXNkIChvcmlnaW5hbCkNCiMgYSBtMw0KcHJlY2lvX2V4cG9fYm9saXZpYV91c2RfeXBmYiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1ByZWNpb3MvcHJlY2lvX2V4cG9fYm9saXZpYS54bHN4IikgJT4lDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByZWNpb19leHBvX2JvbGl2aWFfYXJnX2dhcyIsICJwcmVjaW9fZXhwb19ib2xpdmlhX2J6bF9nYXMiKSwNCiAgICAgICAgICAgIC5mdW5zID0gZnVuY3Rpb24oeCkge2NvbnZlcnNvcl9mdDNtM19wKHgpfSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gInVzZC9NaWxlcyBkZSBtMyIpDQoNCg0KIyBhIE1NIEJUVQ0KcHJlY2lvX2V4cG9fYm9saXZpYV91c2RfTU1CVFVfeXBmYiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1ByZWNpb3MvcHJlY2lvX2V4cG9fYm9saXZpYS54bHN4IikgJT4lDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByZWNpb19leHBvX2JvbGl2aWFfYXJnX2dhcyIsICJwcmVjaW9fZXhwb19ib2xpdmlhX2J6bF9nYXMiKSwNCiAgICAgICAgICAgIC5mdW5zID0gZnVuY3Rpb24oeCkge2NvbnZlcnNvcl9mdDNNTUJUVV9wKHgvMTAwMCl9KSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAidXNkL01NQlRVIikgJT4lIA0KICByZW5hbWUocHJlY2lvX2V4cG9fYm9saXZpYV9hcmdfeXBmYiA9IHByZWNpb19leHBvX2JvbGl2aWFfYXJnX2dhcywNCiAgICAgICAgIHByZWNpb19leHBvX2JvbGl2aWFfYnpsX3lwZmIgPSBwcmVjaW9fZXhwb19ib2xpdmlhX2J6bF9nYXMpICANCg0KDQojcHJlY2lvIGJvbGl2aWEgZW4gcGVzb3MgDQojc3VtYXJsZSBlbCBmbGV0ZSA9IDAuMDI0MTI5Nzk0DQpwcmVjaW9fZXhwb19ib2xpdmlhX3Blc29zX3lwZmIgPC0gIHByZWNpb19leHBvX2JvbGl2aWFfdXNkX3lwZmIgJT4lIA0KICAgIGxlZnRfam9pbih0Y3BfYW51YWwpICU+JQ0KICBtdXRhdGUocHJlY2lvX2V4cG9fYm9saXZpYV9hcmdfZ2FzX3Blc29zID0gcHJlY2lvX2V4cG9fYm9saXZpYV9hcmdfZ2FzICogVENDICwgDQogICAgICAgICBwcmVjaW9fZXhwb19ib2xpdmlhX2J6bF9nYXNfcGVzb3MgPSBwcmVjaW9fZXhwb19ib2xpdmlhX2J6bF9nYXMgKiBUQ0MsDQogICAgICAgICB1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIikNCg0KDQojcHJlY2lvIGltcG8gZGUgYXJnZW50aW5hIGRlc2RlIGJvbGl2aWEgVU4gQ29tdHJhZGUNCmdhc19pbXBvX2JvbGl2aWFfY29tdHJhZGVfdXNkIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9VTiBDb210cmFkZS9yZXN1bHRhZG9zL2dhc19pbXBvX2JvbGl2aWFfY29tdHJhZGUuY3N2IikgJT4lDQogIHNlbGVjdChQZXJpb2QsICJUcmFkZSBGbG93IiwgUmVwb3J0ZXIsIFBhcnRuZXIsICJDb21tb2RpdHkgQ29kZSIsIENvbW1vZGl0eSwNCiAgICAgICAgIFF0eSwgdHJhZGVfdmFsdWVfdXNkLCBwcmVjaW9faW1wb19nYXNfYm9saXZpYSwgdW5pZGFkX3ByZWNpbywgdW5pZGFkX2NhbnRpZGFkKSAlPiUgDQogIHJlbmFtZShhbmlvID0gUGVyaW9kKSAlPiUgDQogIG11dGF0ZShwcmVjaW9faW1wb19nYXNfYm9saXZpYV9NTUJUVV9jb210cmFkZSA9IGNvbnZlcnNvcl9tM01NQlRVX3AocHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWEpLA0KICAgICAgICAgdW5pZGFkID0gInVzZC9NTUJUVSIpDQoNCiNwYXNhamUgYSBwZXNvcw0KZ2FzX2ltcG9fYm9saXZpYV9jb210cmFkZSA8LSBnYXNfaW1wb19ib2xpdmlhX2NvbXRyYWRlX3VzZCAgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IsIGJ5ID0gImFuaW8iKSAlPiUgDQogIG11dGF0ZShwcmVjaW9faW1wb19nYXNfYm9saXZpYSA9IHByZWNpb19pbXBvX2dhc19ib2xpdmlhICogdGNjLA0KICAgICAgICAgdW5pZGFkX3ByZWNpbyA9ICJhcnMvTWlsZXMgZGUgbTMiKQ0KDQoNCiNwcmVjaW8gZXhwbyBib2xpdmlhIFVOIENPTVRSQURFDQpnYXNfZXhwb19ib2xpdmlhX2NvbXRyYWRlX3VzZCA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvVU4gQ29tdHJhZGUvcmVzdWx0YWRvcy9nYXNfZXhwb19ib2xpdmlhX2NvbXRyYWRlLmNzdiIpICU+JQ0KICBzZWxlY3QoUGVyaW9kLCAiVHJhZGUgRmxvdyIsIFJlcG9ydGVyLCBQYXJ0bmVyLCAiQ29tbW9kaXR5IENvZGUiLCBDb21tb2RpdHksDQogICAgICAgICBRdHksIHRyYWRlX3ZhbHVlX3VzZCwgcHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWEsIHVuaWRhZF9wcmVjaW8sIHVuaWRhZF9jYW50aWRhZCkgJT4lIA0KICByZW5hbWUoYW5pbyA9IFBlcmlvZCkgJT4lIA0KICAgbXV0YXRlKHByZWNpb19leHBvX2dhc19ib2xpdmlhX2FyZ19NTUJUVV9jb210cmFkZSA9IGNvbnZlcnNvcl9tM01NQlRVX3AocHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWEpLA0KICAgICAgICAgdW5pZGFkID0gInVzZC9NTUJUVSIpDQoNCiNwYXNhamUgYSBwZXNvcw0KZ2FzX2V4cG9fYm9saXZpYV9jb210cmFkZSA8LSAgZ2FzX2V4cG9fYm9saXZpYV9jb210cmFkZV91c2QgJT4lDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiwgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHByZWNpb19leHBvX2dhc19ib2xpdmlhID0gcHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWEgKiB0Y2MsDQogICAgICAgICB1bmlkYWRfcHJlY2lvID0gImFycy9NaWxlcyBkZSBtMyIpDQpgYGANCg0KIyMjIyMgVG9kb3MgbG9zIHByZWNpb3MNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojUHJlY2lvIGRlIGV4cG9ydGFjaW9uIHkgcmVmZXJlbmNpYSBkZSBHYXMuIE1lcmdlIGRlIGJhc2VzDQoNCiNwcmVjaW9zIGVuIHVzZA0KcHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVIDwtIHByaWNlX2VldXVfTU1CVFUgJT4lIA0KICBsZWZ0X2pvaW4oICBoZW5yeV9odWIpICU+JQ0KICBsZWZ0X2pvaW4oYnBfZ2FzX3ByaWNlcykgJT4lIA0KICBsZWZ0X2pvaW4oZm1pX2dhc19wcmljZSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX2V4cG9fYm9saXZpYV91c2RfTU1CVFVfeXBmYikgJT4lIA0KICBsZWZ0X2pvaW4oZ2FzX2ltcG9fYm9saXZpYV9jb210cmFkZV91c2QgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9faW1wb19nYXNfYXJnX2JvbGl2aWFfY29tdHJhZGUgPSBwcmVjaW9faW1wb19nYXNfYm9saXZpYV9NTUJUVV9jb210cmFkZSkpICU+JSANCiAgbGVmdF9qb2luKGdhc19leHBvX2JvbGl2aWFfY29tdHJhZGVfdXNkICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgDQogICAgICAgICAgICAgICAgICAgICBwcmVjaW9fZXhwb19nYXNfYm9saXZpYV9hcmdfY29tdHJhZGUgPSBwcmVjaW9fZXhwb19nYXNfYm9saXZpYV9hcmdfTU1CVFVfY29tdHJhZGUpKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9faWRlZV9pbXBvX2dhcyAlPiUgc2VsZWN0KGFuaW8sIHByZWNpb19nYXNfYm9saXZpYV91c2RfaWRlZSkpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19leHBvX2dhc191c2QpICU+JSANCiAgbXV0YXRlKHByZWNpb19pbXBvX2dhc19ib2xpdmlhX2lkZWUgPSBjb252ZXJzb3JfbTNNTUJUVV9wKHByZWNpb19nYXNfYm9saXZpYV91c2RfaWRlZS8xMDAwKSwjb2sNCiAgICAgICAgIHByZWNpb19leHRlcm5vX2dhcyA9IGNhc2Vfd2hlbiggYW5pbyA8IDE5NjYgfiBwcmVjaW9faW1wb19nYXNfYXJnX2JvbGl2aWFfY29tdHJhZGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR+IHByZWNpb19leHBvX2dhc19ib2xpdmlhX2FyZ19jb210cmFkZSkpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX2V4dGVybm9fZ2FzLCBldmVyeXRoaW5nKC4pLCAtcHJlY2lvX2dhc19ib2xpdmlhX3VzZF9pZGVlKSAlPiUgDQogIGZpbHRlcihhbmlvIDwgMjAyMSkNCg0KcHJlY2lvX21kb211bmRpYWxfZ2FzX2JlcCA8LSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUgJT4lDQogIHNlbGVjdCgtdW5pZGFkKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgbXV0YXRlX2FsbChjb252ZXJzb3JfTU1CVFViZXBfcCkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gInVzZC9iZXAiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLikpDQoNCmNvbXBhcmFjaW9uX2JlcCA8LSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfYmVwICU+JSANCiAgICAjIHNlbGVjdChhbmlvLCBwcmVjaW9fZXh0ZXJub19nYXMpICU+JQ0KICBsZWZ0X2pvaW4ocHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBicmVudF9oaXN0b3JpYywgd3RpX3Nwb3RfcHJpY2VfZnJlZCwNCiAgICAgICAgICAgICAgICAgICAgIHByZWNpb19leHBvX2NvbXRyYWRlX3NpdGNfY3J1ZG8pKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAidXNkL2JlcCIpDQogIA0KIyBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTW0zIDwtIHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSAlPiUNCiMgICBzZWxlY3QoLXVuaWRhZCkgJT4lIA0KIyAgIGdyb3VwX2J5KGFuaW8pICU+JSANCiMgICBtdXRhdGVfYWxsKGNvbnZlcnNvcl9tM01NQlRVX3ApICU+JSANCiMgICBtdXRhdGUodW5pZGFkID0gInVzZC9iZXAiKSAlPiUgDQojICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCiAgDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KE1NQlRVID0gcHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgIEJFUCA9IHByZWNpb19tZG9tdW5kaWFsX2dhc19iZXApLCBwYXRoID0gInJlc3VsdGFkb3MvcHJlY2lvX21kb19tdW5kaWFsX2dhcy54bHN4IikNCg0KI2dyYWZpY28gcHJlY2lvcyBiZXANCmdyYWZfcHJlY2lvX21kb19tdW5kaWFsX2dhc19iZXAgPC0gcHJlY2lvX21kb211bmRpYWxfZ2FzX2JlcCAlPiUgDQogIHNlbGVjdCgtcHJlY2lvX2V4dGVybm9fZ2FzKSAlPiUgDQogIGdhdGhlcihrZXkgPSB0aXBvX3ByZWNpbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAzOm5jb2woLikpICU+JQ0KICAjIGZpbHRlcighKHRpcG9fcHJlY2lvICVpbiUgYygicHJlY2lvX2dhc19ib2xpdmlhX3VzZF9pZGVlIiwgInByZWNpb19pbXBvX2dhc19ib2xpdmlhX01NQlRVX2NvbXRyYWRlIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZWNpb19leHBvX2dhc19jb210cmFkZSIsICJwcmVjaW9fZXhwb19nYXNfaW5kZWMiKSkpICU+JQ0KICBmaWx0ZXIoISh0aXBvX3ByZWNpbyAlaW4lIGMoInByZWNpb19leHBvX2dhc19pbmRlYyIpKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBhbmlvLCB5ID0gdmFsb3IsIGNvbG9yID0gdGlwb19wcmVjaW8pKSsNCiAgZ2VvbV9saW5lKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnMoeSA9ICJ1c2QvYmVwIikNCiMgcGxvdGx5OjpnZ3Bsb3RseShncmFmX3ByZWNpb19tZG9fbXVuZGlhbF9nYXNfYmVwKQ0KDQpncmFmX3ByZWNpb19tZG9fbXVuZGlhbF9nYXNfbW1idHUgPC0gcHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVICU+JSANCiAgZmlsdGVyKHByZWNpb19leHRlcm5vX2dhcyA8IDI1KSAlPiUgDQogIGdhdGhlcihrZXkgPSB0aXBvX3ByZWNpbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAzOm5jb2woLikpICU+JQ0KICBmaWx0ZXIoDQogICAgdmFsb3IgPCAyNSwNCiAgICAhKHRpcG9fcHJlY2lvICVpbiUgYygiYnBfb2lsX21peF9tZWFuX29lY2QiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICwgInByZWNpb19leHBvX2dhc19pbmRlYyINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgInByZWNpb19nYXNfYm9saXZpYV91c2RfaWRlZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJwcmVjaW9faW1wb19nYXNfYXJnX2JvbGl2aWFfY29tdHJhZGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAicHJlY2lvX2V4cG9fZ2FzX2NvbXRyYWRlIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkpICU+JQ0KICAjIGZpbHRlcighKHRpcG9fcHJlY2lvICVpbiUgYygicHJlY2lvX2V4cG9fZ2FzX2luZGVjIikpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGFuaW8sIHkgPSB2YWxvciwgY29sb3IgPSB0aXBvX3ByZWNpbykpKw0KICBnZW9tX2xpbmUoKSArDQogICMgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSsNCiAgbGFicyh0aXRsZSA9ICJQcmVjaW9zIGRlIGV4cG9ydGFjacOzbiB5IHJlZmVyZW5jaWEgZGVsIG1lcmNhZG8gbXVuZGlhbCBkZWwgZ2FzIiwgDQogICAgICAgeSA9ICJ1c2QvTU1CVFUiKQ0KZ2dwbG90bHkoZ3JhZl9wcmVjaW9fbWRvX211bmRpYWxfZ2FzX21tYnR1LCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KDQoNCiNwcmVjaW9zIGVuIGFycy4gSU5DT01QTEVUTw0KcHJlY2lvX2V4cG9feV9tZV9nYXMgPC0gcHJlY2lvX2V4cG9fZ2FzICU+JQ0KICBmdWxsX2pvaW4ocHJlY2lvX2lkZWVfaW1wb19nYXMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fZ2FzX2JvbGl2aWFfaWRlZSkpICU+JSANCiAgZnVsbF9qb2luKHByZWNpb19leHBvX2JvbGl2aWFfcGVzb3NfeXBmYiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIA0KICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2JvbGl2aWFfeXBmYiA9IHByZWNpb19leHBvX2JvbGl2aWFfYXJnX2dhc19wZXNvcyApKSAlPiUgDQogIGZ1bGxfam9pbihnYXNfaW1wb19ib2xpdmlhX2NvbXRyYWRlICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9wcmVjaW8sDQogICAgICAgICAgICAgICAgICAgICBwcmVjaW9faW1wb19nYXNfYm9saXZpYV9jb210cmFkZSA9IHByZWNpb19pbXBvX2dhc19ib2xpdmlhICkpICU+JSANCiAgbGVmdF9qb2luKGdhc19leHBvX2JvbGl2aWFfY29tdHJhZGUgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3ByZWNpbywgDQogICAgICAgICAgICAgICAgICAgICBwcmVjaW9fZXhwb19nYXNfYm9saXZpYV9jb210cmFkZSA9IHByZWNpb19leHBvX2dhc19ib2xpdmlhICkpICU+JQ0KICBsZWZ0X2pvaW4oaGVucnlfaHViKSAlPiUgDQogIGFycmFuZ2UoYW5pbykNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByZWNpb19leHBvX3lfbWVfZ2FzLCBwYXRoID0gInByZWNpb19leHBvX3lfbWRvX211bmRpYWxfZ2FzLnhsc3giKQ0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGNvbXBhcmFjaW9uX2JlcCwgcGF0aCA9ICJjb21wYXJhY2lvbl9iZXAueGxzeCIpDQoNCg0KY29tcGFyYWNpb25fcHJlY2lvcyA8LSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fZXh0ZXJub19nYXMpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19pbnRlcm5vX2dhc19tbWJ0dV91c2QgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fZ2FzX21kb2ludCkpDQogDQpgYGANCmJ1c2NhbW9zIHVuIHByZWNpbw0KDQpjdWFudG8gZXMgdW5hIGNhbnRpZGFkIGRlIGJ0dSBkZSBnYXMgYWwgcHJlY2lvIGRlIHJlZmVyZW5jaWEgKGVqIGJvbGl2aWEpIHkgY3VhbnRvIGVzIHNpIGNvbnZpZXJ0byBlc29zIGJ0dSBhIGJhcnJpbGVzIHkgbG9zIHZhbG9yaXpvIGNvbiBlbCBwcmVjaW8gZGVsIGJhcnJpbD8gY3VhbnRvIHF1ZWRhIGxhIHVuaWRhZCBlbiBidHUgc2kgdG9tbyBlbCBwcmVjaW8gZGUgcGV0cm9sZW8geSBsbyBjb3ZpZXJ0byBhIGJ0dS4gDQplcyBkZWNpciwgY3VhbnRvIGVzIGVsIHZhbG9yIHNpIGxhIHZhbG9yaXpvIGVuIHByZWNpbyBkZWwgcGV0cm9sZW8NCg0Kwr9jdWFudG9zIHVzZCBlcyB1biBidHUgZGUgcGV0cm9sZW8/DQpzaSB0b21vIHVuIGJhcnJpbCBkZSBwZXRyb2xlbyB5IGxvIGNvbnZpZXJ0byBhIGJ0dSAoIG1lIHZhIGEgZGFyIGN1YW50b3MgdXNkIGVzIHVuIGJ0dSkNCmx1ZWdvIGNvbXBhcm8gbG9zIHVzZC9idHUgeSBsbyBjb21wYXJvIGNvbiBlbCBnYXMgZGUgYm9saXZpYQ0KDQpncmluYmVyOiBjb252aWVydGUgdG9kbyBlbCBnYXMgZW4gcGV0cm9sZW8geSBsZSBwb25lIGVsIHByZWNpbyBkZSBwZXRyb2Vsb2UuIHN1YmVzdGltYSBsb3MgcHJlY2lvcyBkZWwgZ2FzPw0KDQpgYGB7cn0NCnByZWNpb19jcnVkb192c19nYXMgPC0gcHJlY2lvX21kb211bmRpYWxfZ2FzX2JlcCAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19leHRlcm5vX2dhcykgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgtdW5pZGFkKSAlPiUgDQogICAgICAgICAgICAgIGdhdGhlcihrZXkgPSB0aXBvX3ByZWNpb19jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlICAgPSBwcmVjaW9fY3J1ZG9fdXNkX2JibCwNCiAgICAgICAgICAgICAgICAgICAgIDI6bmNvbCguKSksIGJ5ID0iYW5pbyIpICU+JSANCiAgbXV0YXRlKHByZWNpb19jcnVkb19zb2JyZV9nYXMgPXByZWNpb19jcnVkb191c2RfYmJsL3ByZWNpb19leHRlcm5vX2dhcykgJT4lIA0KICBmaWx0ZXIoIShpcy5uYShwcmVjaW9fY3J1ZG9fc29icmVfZ2FzKSksIA0KICAgICAgICAgISh0aXBvX3ByZWNpb19jcnVkbyAlaW4lIGMoInd0aV9zcG90X3ByaWNlX2ZyZWQiLCAicHJlY2lvX21lX2NydWRvIikpICApDQogICAgICAgICAjICh0aXBvX3ByZWNpb19jcnVkbyAlaW4lIGMoImJyZW50X2llYSIpKSAgKQ0KICAgICAgICAgIyAodGlwb19wcmVjaW9fY3J1ZG8gJWluJSBjKCJicmVudF9pZWEiLCAiYnJlbnRfaGlzdG9yaWMiKSkgICkNCnByZWNpb19jcnVkb192c19nYXMNCg0KZ3JhZiA8LSAgcHJlY2lvX2NydWRvX3ZzX2dhcyAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgcHJlY2lvX2NydWRvX3NvYnJlX2dhcywgY29sb3I9dGlwb19wcmVjaW9fY3J1ZG8pKSsNCiAgZ2VvbV9saW5lKCkrDQogIGxhYnModGl0bGUgPSAicHJlY2lvIGRlbCBjcnVkbyBzb2JyZSBlbCBkZWwgZ2FzIChhbWJvcyBlbiBiYXJyaWxlcykiKQ0KDQpnZ3Bsb3RseShncmFmLCB3aWR0aCA9IDgwMCwgbGVuZ3RoPTYwMCkNCiMgZ3JhZg0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvX2NydWRvX3ZzX2dhcywgcGF0aD0gInByZWNpbyBkZWwgY3J1ZG8gdnMgZ2FzLnhsc3giKSAgDQpgYGANCg0KDQoNCiMjIEV4cG9ydGFjaW9uZXMgZSBJbXBvcnRhY2lvbmVzDQoNCiogRnVlbnRlcw0KICArIFtTRVNDTyBEb3duc3RyZWFtXShodHRwczovL2RhdG9zLmdvYi5hci9kYXRhc2V0L2VuZXJnaWEtcmVmaW5hY2lvbi1jb21lcmNpYWxpemFjaW9uLXBldHJvbGVvLWdhcy1kZXJpdmFkb3MtdGFibGFzLWRpbmFtaWNhcykNCiAgKyBJTkRFQw0KICArIE1FQ09ODQogICsgVU5Db210cmFkZQ0KDQojIyMjIEV4cG9ydGFjaW9uZXMgZSBJbXBvcnRhY2lvbmVzIGRlIENydWRvDQoqIEV4cG9ydGFjaW9uZXMgZGUgQ3J1ZG86IA0KICArIDE5NjIgYSAxOTkzOiBVTiBDb210cmFkZQ0KICArIDE5OTQgZW4gYWRlbGFudGU6IFNFU0NPIERvd25zdHJlYW0NCiAgKyBMb3MgZGF0b3MgZmFsdGFudGVzIGRlIFNFU0NPIHNlIGNvbXBsZXRhcm9uIGNvbiBNRUNPTg0KICArIFNpZ3VlbiBoYWJpZW5kbyBkYXRvcyBmYWx0YW50ZXMgcGFyYSBsb3MgYcOxb3MgMTk2NSwgMTk3MC03NCwgMTk3Ni03OCwgMTk4MC04NA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyMjIFNFU0NPDQojY2FudGlkYWRlcy4gcG9zdCAyMDEwIChoYXN0YSAyMDE5KQ0KaW1wb3J0YWNpb25lc19leHBvcnRhY2lvbmVzIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1NFU0NPL1JlZmluYWNpw7NuIHkgY29tZXJjaWFsaXphY2lvbi9pbXBvcnRhY2lvbmVzLWV4cG9ydGFjaW9uZXMuY3N2IikNCg0KIyBjYW50aWRhZGVzLiBwb3N0IDIwMTYgDQppbXBvcnRhY2lvbmVzX2V4cG9ydGFjaW9uZXNfcG9zdDIwMTYgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvU0VTQ08vUmVmaW5hY2nDs24geSBjb21lcmNpYWxpemFjaW9uL2ltcG9ydGFjaW9uZXMtZXhwb3J0YWNpb25lcy1hLXBhcnRpci1kZWwtMjAxNi0uY3N2IikNCg0KIyMjI2NvbWVyY2lvIGV4dGVyaW9yIHBvc3QgMjAxMDogIlREX2NvbWVyY2lvX2V4dGVyaW9yLnhsc3giDQpjb21leF9wb3N0MjAxMCA8LSByZWFkX2RlbGltKCIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9jb21leF9wb3N0MjAxMC5jc3YiLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUsIA0KICAgIHNraXAgPSA1KSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSBjYXNlX3doZW4oRGF0b3MgPT0gIlN1bWEgZGUgbW9udG8iIH4gInVzZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHVuaWRhZCksDQogICAgICAgICAJdW5pZGFkID0gc3RyX3JlbW92ZV9hbGwoCXVuaWRhZCwgIlsoKV0iICksDQogICAgICAgICBmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHBhc3RlMChhbmlvLCBtZXMpLCBvcmRlcnMgPSAieW0iKSkpICU+JSAgDQogIGZpbHRlcighaXMubmEoYW5pbykpICU+JSANCiAgcmVuYW1lKGV4cG9ydGFjaW9uID0gIkV4cG9ydGFjacOzbiIsDQogICAgICAgICBpbXBvcnRhY2lvbiA9ICJJbXBvcnRhY2nDs24iKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgYW5pbywgbWVzLCBldmVyeXRoaW5nKC4pLCAtYygiVG90YWwgZ2VuZXJhbCIsIERhdG9zKSkgJT4lIA0KICBnYXRoZXIoLiwNCiAgICAgICAgIGtleSA9IHZhcmlhYmxlLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDY6NykNCg0KI290cmEgYmFzZS4gc29sbyBjYW50aWRhZGVzLiB2ZXIgZGUgZG9uZGUgYXBhcmVjacOzDQppbXBvX2V4cG8gPC0gcmVhZF9jc3YoIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL2RhdGFzZXRzL2ltcG9ydGFjaW9uZXMtZXhwb3J0YWNpb25lcyAoMSkuY3N2IikNCg0KDQojIyNleHBvcnRhY2lvbmVzIHByZSAyMDEwOiAiRXhwb3J0YWNpb25lcy54bHN4Ig0KZXhwb19wcmUyMDEwIDwtIHJlYWRfZGVsaW0oIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL2RhdGFzZXRzL2V4cG9fcHJlMjAxMC5jc3YiLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiQcOxbyIsDQogICAgICAgICBtZXMgPSAiTWVzIiwNCiAgICAgICAgIHByb2R1Y3RvID0gUHJvZHVjdG8sDQogICAgICAgICB2YWxvciA9IFRvdGFsKSAlPiUgDQogIG11dGF0ZShhbmlvID0gem9vOjpuYS5sb2NmKGFuaW8pLA0KICAgICAgICAgbWVzID0gem9vOjpuYS5sb2NmKG1lcyksDQogICAgICAgICBwcm9kdWN0byA9IHpvbzo6bmEubG9jZihwcm9kdWN0byksDQogICAgICAgICB2YXJpYWJsZSA9ICJleHBvcnRhY2lvbiIsDQogICAgICAgICBmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHBhc3RlMChhbmlvLCBtZXMpLCBvcmRlcnMgPSAieW0iKSksDQogICAgICAgICB1bmlkYWQgPSBjYXNlX3doZW4oc3RyX2RldGVjdChEYXRvcywgIk0zIikgfiAibTMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoRGF0b3MsICJUb24iKSB+ICJ0b24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoRGF0b3MsICJGT0IiKSB+ICJ1c2QiKSkgJT4lIA0KICBzZWxlY3QoZmVjaGEsIGV2ZXJ5dGhpbmcoLiksIC1jKERhdG9zKSkNCg0KI25vIHNlIGRlIGRvbmRlIHNhbGnDsyBlc3RlIHBlcm8gaGFicmlhIHEgcmFzdHJlYXJsbw0KZXhwb191c2RfdG9uIDwtIHJlYWRfZGVsaW0oIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvZXhwb191c2RfdG9uLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSwgDQogICAgc2tpcCA9IDMpDQoNCiMjI2ltcG9ydGFjaW9uZXMgcHJlIDIwMTA6ICJJbXBvcnRhY2lvbmVzLnhsc3giDQppbXBvX3ByZTIwMTAgPC0gcmVhZF9kZWxpbSgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvaW1wb19wcmUyMDEwLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw7FvIiwNCiAgICAgICAgIG1lcyA9ICJNZXMiLA0KICAgICAgICAgcHJvZHVjdG8gPSBQcm9kdWN0bywNCiAgICAgICAgIHZhbG9yID0gVG90YWwpICU+JSANCiAgbXV0YXRlKGFuaW8gPSB6b286Om5hLmxvY2YoYW5pbyksDQogICAgICAgICBtZXMgPSB6b286Om5hLmxvY2YobWVzKSwNCiAgICAgICAgIHByb2R1Y3RvID0gem9vOjpuYS5sb2NmKHByb2R1Y3RvKSwNCiAgICAgICAgIHZhcmlhYmxlID0gImltcG9ydGFjaW9uIiwNCiAgICAgICAgIGZlY2hhID0gYXMuRGF0ZShwYXJzZV9kYXRlX3RpbWUocGFzdGUwKGFuaW8sIG1lcyksIG9yZGVycyA9ICJ5bSIpKSwNCiAgICAgICAgIHVuaWRhZCA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KERhdG9zLCAiTTMiKSB+ICJtMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChEYXRvcywgIlRvbiIpIH4gInRvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChEYXRvcywgIkZPQiIpIH4gInVzZCIpKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgZXZlcnl0aGluZyguKSwgLWMoRGF0b3MpKQ0KIyBpbXBvX3ByZTIwMTANCg0KDQojQmFzZSB1bmlkYSBkZSBTRVNDTw0KY29tZXJjaW9fZXh0ZXJpb3IgPC0gY29tZXhfcG9zdDIwMTAgJT4lIA0KICBiaW5kX3Jvd3MoaW1wb19wcmUyMDEwLCBleHBvX3ByZTIwMTApICU+JSANCiAgYXJyYW5nZShmZWNoYSkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSBjYXNlX3doZW4odW5pZGFkID09ICJtaWxlcy9tMyIgfiB2YWxvciAqIDEwMDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdmFsb3IpLA0KICAgICAgICAgdW5pZGFkID0gY2FzZV93aGVuKHVuaWRhZCA9PSAibWlsZXMvbTMiIH4gIm0zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdW5pZGFkKSkNCg0KI2V4cG8gZSBpbXBvIGRlIENydWRvLiBjYW50aWRhZGVzIHkgdmFsb3INCmNvbWV4X2NydWRvX3Nlc2NvIDwtIGNvbWVyY2lvX2V4dGVyaW9yICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QocHJvZHVjdG8sICJQRVRST0xFTyIpIHwgc3RyX2RldGVjdChwcm9kdWN0bywgIkN1ZW5jYSIpLA0KICAgICAgICAgdW5pZGFkICE9ICJUb24iKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHZhcmlhYmxlLCB1bmlkYWQpICU+JSANCiAgc3VtbWFyaXNlKHZhbG9yID0gc3VtKHZhbG9yLCBuYS5ybSA9IFQpKSAlPiUgDQogIG11dGF0ZShwcm9kdWN0byA9ICJjcnVkbyIsDQogICAgICAgICB2YWxvciA9IGNhc2Vfd2hlbih1bmlkYWQgPT0gIm0zIiB+IGNvbnZlcnNvcl9tM2JibF9xKHZhbG9yKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YWxvciksDQogICAgICAgICB1bmlkYWQgPSBjYXNlX3doZW4odW5pZGFkID09ICJtMyIgfiAiYmFycmlsZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB1bmlkYWQpKQ0KDQoNCiNxdcOpIHByb2R1Y3RvcyBlbnRyYW4gZW4gZWwgZmlsdHJvIGRlIGNydWRvPw0KIyB1bmlxdWUoKGNvbWVyY2lvX2V4dGVyaW9yICU+JSBmaWx0ZXIoc3RyX2RldGVjdChwcm9kdWN0bywgIlBFVFJPTEVPIikgfCBzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiQ3VlbmNhIikpKSRwcm9kdWN0bykNCg0KDQojTUVDT04NCmNvbWV4X2hpZHJvY2FyYnVyb3NfbWVjb24gPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NZWNvbi9iYXNlLW1pbmVyaWEtZS1oaWRyb2NhcmJ1cm9zIGN1ZW50YXMgbmFjaW9uYWxlcy54bHMiLCANCiAgICBzaGVldCA9ICJDb20uIGV4dGVyaW9yIiwgc2tpcCA9IDcpICU+JQ0KICByZW5hbWUoYW5pbyA9ICcuLi4xJyAsDQogICAgICAgICBleHBvX01tM19jcnVkbyA9ICdFeHBvcnRhY2lvbmVzLi4uMicsDQogICAgICAgICBpbXBvX01tM19jcnVkbyA9ICdJbXBvcnRhY2lvbmVzLi4uMycsDQogICAgICAgICBzYWxkb19NbTNfY3J1ZG8gPSBgQmFsYW5jZSAoWC1NKS4uLjRgLA0KICAgICAgICAgZXhwb19NTW0zX2dhcyA9ICdFeHBvcnRhY2lvbmVzLi4uNScsDQogICAgICAgICBpbXBvX01tM19nYXMgPSAnSW1wb3J0YWNpb25lcy4uLjYnLA0KICAgICAgICAgc2FsZG9fTW0zX2dhcyA9IGBCYWxhbmNlIChYLU0pLi4uN2AsDQogICAgICAgICBleHBvX21ldGFsaWZlcm9zX290cm9zX01NdXNkID0gYE1pbmVyYWxlcyBtZXRhbMOtZmVyb3MsIGVzY29yaWFzIHkgY2VuaXphc2AsDQogICAgICAgICBleHBvX2NydWRvX01NdXNkID0gYFBldHLDs2xlbyBjcnVkb2AsDQogICAgICAgICBleHBvX2dhc19NTXVzZCA9IGBHYXMgZGUgcGV0csOzbGVvIHkgb3Ryb3MgaGlkcm9jYXJidXJvc2AsDQogICAgICAgICBleHBvX2NhcmJ1cmFudGVzX290cm9zX01NdXNkID0gYENhcmJ1cmFudGVzLCBncmFzYXMgeSBhY2VpdGVzIGx1YnJpY2FudGVzYCwNCiAgICAgICAgIGV4cG9fZWxlY3RyaWNhX01NdXNkID0gYEVuZXJnw61hIGVsw6ljdHJpY2FgLA0KICAgICAgICAgZXhwb19yZXN0b19jb21idXN0aWJsZXNfTU11c2QgPSBgUmVzdG8gZGUgY29tYnVzdGlibGVzYCkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGFuaW8gKSkgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkgJT4lIA0KICBtdXRhdGUoZXhwb19iYmxfY3J1ZG8gPSBjb252ZXJzb3JfbTNiYmxfcShleHBvX01tM19jcnVkbyoxMDAwKSwNCiAgICAgICAgIGltcG9fYmJsX2NydWRvID0gY29udmVyc29yX20zYmJsX3EoaW1wb19NbTNfY3J1ZG8qMTAwMCksDQogICAgICAgICBzYWxkb19iYmxfY3J1ZG8gPSBjb252ZXJzb3JfbTNiYmxfcShzYWxkb19NbTNfY3J1ZG8qMTAwMCkpDQoNCg0KI0lOREVDIC0gQ29tRXgNCiNjYW50aWRhZGVzDQpjYW50aWRhZGVzX2V4cG9faGlkcm9faW5kZWMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0lOREVDL0NvbUV4L2NhbnRpZGFkZXNfZXhwb19oaWRyb19pbmRlYy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpICU+JSANCiAgcmVuYW1lKGV4cG9faW5kZWNfY3J1ZG8gPSBwZXRyb2xlb19jcnVkb19leHBvLA0KICAgICAgICAgICBleHBvX2luZGVjX2dhcyAgPSBnYXNfbmF0dXJhbF9leHBvKQ0KDQojdmFsb3INCmV4cG9faGlkcm9fdmFsb3JfaW5kZWMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0lOREVDL0NvbUV4L2V4cG9faGlkcm9fdmFsb3IuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKSAlPiUgDQogIHJlbmFtZShleHBvX2luZGVjX2NydWRvID0gcGV0cm9sZW9fY3J1ZG9fZXhwbywNCiAgICAgICAgICAgZXhwb19pbmRlY19nYXMgID0gZ2FzX25hdHVyYWxfZXhwbykNCg0KDQoNCiNNZXJnZSBkZSBiYXNlcw0KI0NydWRvIGV4cG8gY2FudGlkYWQNCmV4cG9fcV9jcnVkbyA8LSBjb21leF9jcnVkb19zZXNjbyAlPiUNCiAgZmlsdGVyKHZhcmlhYmxlID09ICJleHBvcnRhY2lvbiIsDQogICAgICAgICB1bmlkYWQgPT0gImJhcnJpbGVzIikgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHZhbG9yKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHJlbmFtZShleHBvX3Nlc2NvX2NydWRvID0gdmFsb3IpICU+JSANCiAgbGVmdF9qb2luKGNvbWV4X2hpZHJvY2FyYnVyb3NfbWVjb24gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZXhwb19tZWNvbl9jcnVkbyA9IGV4cG9fYmJsX2NydWRvKSkgJT4lIA0KICBsZWZ0X2pvaW4oY2FudGlkYWRlc19leHBvX2hpZHJvX2luZGVjICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KC1leHBvX2luZGVjX2dhcykpICU+JSANCiAgZnVsbF9qb2luKGV4cG9fY3J1ZG9fc2l0YyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfY2FudGlkYWQsIGV4cG9fY29tdHJhZGVfY3J1ZG8gPSBleHBvX2JibCApKSAlPiUgDQogIG11dGF0ZShleHBvX2NydWRvID0gY2FzZV93aGVuKGFuaW8gPCAxOTk0IHwgYW5pbyA9PSAxOTk5IH4gZXhwb19jb210cmFkZV9jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShleHBvX3Nlc2NvX2NydWRvKSB+IGV4cG9fbWVjb25fY3J1ZG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBleHBvX3Nlc2NvX2NydWRvKSwNCiAgICAgICAgIHVuaWRhZCA9ICJiYXJyaWxlcyIsDQogICAgICAgICBkaWYgPSBleHBvX2NydWRvL2V4cG9faW5kZWNfY3J1ZG8gLSAxKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsZXhwb19jcnVkbywgZXZlcnl0aGluZyguKSwgLXZhcmlhYmxlKSAlPiUgDQogIGFycmFuZ2UoYW5pbykNCg0KDQojIE1lcmdlIGNydWRvIFVTRA0KZXhwb191c2RfY3J1ZG8gPC0gY29tZXhfY3J1ZG9fc2VzY28gJT4lIA0KICBmaWx0ZXIodmFyaWFibGUgPT0gImV4cG9ydGFjaW9uIiAsIHVuaWRhZCA9PSAidXNkIikgJT4lIA0KICByZW5hbWUoZXhwb19jcnVkb19zZXNjbyA9IHZhbG9yKSAlPiUNCiAgbGVmdF9qb2luKGNvbWV4X2hpZHJvY2FyYnVyb3NfbWVjb24gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZXhwb19jcnVkb19tZWNvbiA9IGV4cG9fY3J1ZG9fTU11c2QpKSAlPiUgDQogIGxlZnRfam9pbihleHBvX2hpZHJvX3ZhbG9yX2luZGVjICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9faW5kZWNfY3J1ZG8pKSAlPiUgDQogIGZ1bGxfam9pbihleHBvX2NydWRvX3NpdGMgJT4lIA0KICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF92YWxvciwgZXhwb19jb210cmFkZV9jcnVkbyA9IGV4cG9fdXNkX2NvbXRyYWRlX2NydWRvKSkgJT4lDQogIG11dGF0ZShleHBvX2NydWRvX21lY29uID0gZXhwb19jcnVkb19tZWNvbiAqMTAwMDAwMCwNCiAgICAgICAgIGV4cG9fY3J1ZG8gPSBjYXNlX3doZW4oYW5pbyA8MTk5NCB+IGV4cG9fY29tdHJhZGVfY3J1ZG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPj0gMTk5NCB+IGV4cG9fY3J1ZG9fc2VzY28pKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV4cG9fY3J1ZG8sIGV2ZXJ5dGhpbmcoLiksIC1jKHZhcmlhYmxlLCBwcm9kdWN0bykpICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHt4LzEwXjZ9KQ0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdCh1c2QgPSBleHBvX3VzZF9jcnVkbywgDQogICAgICAgICAgICAgICAgICAgICAgICAgIyBjYW50aWRhZGVzID0gZXhwb19xX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJlY2lvX2V4cG9ydGFjaW9uX3lfcmVmZXJlbmNpYSA9IHByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8pLCANCiAgICAgICAgICAgICAgICAgICAgIyBwYXRoID0gIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvcmVzdWx0YWRvcy9leHBvX2NydWRvLnhsc3giKQ0KDQpleHBvX3FfY3J1ZG8NCmV4cG9fdXNkX2NydWRvDQpgYGANCg0KDQojIyMjIEV4cG9ydGFjaW9uZXMgZSBJbXBvcnRhY2lvbmVzIGRlIEdhcw0KKiBGdWVudGVzIHNlbGVjY2lvbmFkYXM6DQogKyAxOTYyIGEgMTk5NjogVU4gQ29tdHJhZGUsDQogKyAxOTk3IGVuIGFkZWxhbnRlOiBTRVNDTyBEb3duc3RyZWFtDQogKyBEYXRvcyBmYWx0YW50ZXMgcGFyYSBsb3MgYcOxb3MgMTk5OSB5IDIwMDANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNTRVNDTw0KY29tZXhfZ2FzIDwtIGNvbWVyY2lvX2V4dGVyaW9yICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QocHJvZHVjdG8sICJHQVMgTkFUVVJBTCIpIHwgc3RyX2RldGVjdChwcm9kdWN0bywgIkdhcyBOYXR1cmFsIikgDQogICAgICAgICB8IHN0cl9kZXRlY3QocHJvZHVjdG8sICJHYXMgZGUgUmVmaW5lcsOtYSIpLA0KICAgICAgICAgcHJvZHVjdG8gIT0gIkdhcyBOYXR1cmFsIExpY3VhZG8iLA0KICAgICAgICAgdW5pZGFkICE9ICJUb24iKSAlPiUNCiAgZ3JvdXBfYnkoYW5pbywgdmFyaWFibGUsIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2UodmFsb3IgPSBzdW0odmFsb3IsIG5hLnJtID0gVCkpJT4lIA0KICBtdXRhdGUocHJvZHVjdG8gPSAiZ2FzIikNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoY29tZXhfY3J1ZG9fc2VzY28gJT4lIGZpbHRlcih1bmlkYWQgPT0gInVzZCIsIHZhcmlhYmxlID09ICJleHBvcnRhY2lvbiIpLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgY29tZXhfY3J1ZG9fc2VzY28gJT4lIGZpbHRlcih1bmlkYWQgPT0gInVzZCIsIHZhcmlhYmxlID09ICJpbXBvcnRhY2lvbiIpLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgY29tZXhfZ2FzICU+JSBmaWx0ZXIodW5pZGFkID09ICJ1c2QiLCB2YXJpYWJsZSA9PSAiaW1wb3J0YWNpb24iKSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWV4X2dhcyAlPiUgZmlsdGVyKHVuaWRhZCA9PSAidXNkIiwgdmFyaWFibGUgPT0gImV4cG9ydGFjaW9uIikpLCANCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gImNvbWV4X3Nlc2NvLnhsc3giKQ0KDQojRXhwbyBnYXMgU0VTQ08gY2FudGlkYWRlcw0KZXhwb19zZXNjb19xX2dhcyA8LSBjb21leF9nYXMgICU+JQ0KICBmaWx0ZXIodmFyaWFibGUgPT0gImV4cG9ydGFjaW9uIiwNCiAgICAgICAgIHVuaWRhZCA9PSAibTMiKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHNlbGVjdCgtYyh2YXJpYWJsZSwgcHJvZHVjdG8pKSAlPiUNCiAgcmVuYW1lKGV4cG9fc2VzY29fZ2FzID0gdmFsb3IpICU+JQ0KICBtdXRhdGUoZXhwb19zZXNjb19nYXMgPSByZXBsYWNlX25hKGV4cG9fc2VzY29fZ2FzLCAwICksDQogICAgICAgICBleHBvX3Nlc2NvX2dhcyA9IGV4cG9fc2VzY29fZ2FzIC8gMTAwMCwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxlcyBkZSBtMyIpDQoNCiNleHBvIHNlc2NvIGdhcyB2YWxvcg0KZXhwb19zZXNjb191c2RfZ2FzIDwtIGNvbWV4X2dhcyAgJT4lDQogIGZpbHRlcih2YXJpYWJsZSA9PSAiZXhwb3J0YWNpb24iLA0KICAgICAgICAgdW5pZGFkID09ICJ1c2QiKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHNlbGVjdCgtYyh2YXJpYWJsZSwgcHJvZHVjdG8pKSAlPiUNCiAgcmVuYW1lKGV4cG9fc2VzY29fZ2FzID0gdmFsb3IpICU+JQ0KICBtdXRhdGUoZXhwb19zZXNjb19nYXMgPSByZXBsYWNlX25hKGV4cG9fc2VzY29fZ2FzLCAwICkpDQoNCg0KI2V4cG8gVU4gQ29tdHJhZGUNCmV4cG9fZ2FzX3NpdGMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL1VOIENvbXRyYWRlL3Jlc3VsdGFkb3MvZXhwb19nYXNfc2l0Yy5jc3YiKSAgJT4lIA0KICByZW5hbWUodHJhZGVfdmFsdWVfdXNkID0gIlRyYWRlIFZhbHVlIChVUyQpIikgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gInVzZCIsDQogICAgICAgICBleHBvX01tMyA9IGV4cG9fTW0zIC8xMDAwLA0KICAgICAgICAgdW5pZGFkX2NhbnRpZGFkID0gICJNaWxlcyBkZSBtMyIpDQoNCg0KI01lcmdlIGNhbnRpZGFkZXMNCmV4cG9fcV9nYXMgPC0gIGV4cG9fc2VzY29fcV9nYXMgJT4lIA0KICBsZWZ0X2pvaW4oY29tZXhfaGlkcm9jYXJidXJvc19tZWNvbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX2dhc19tZWNvbiA9IGV4cG9fTU1tM19nYXMpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUodW5pZGFkID0gIk1pbGVzIGRlIG0zIiwNCiAgICAgICAgICAgICAgICAgICAgIGV4cG9fZ2FzX21lY29uID0gZXhwb19nYXNfbWVjb24gKiAxMDAwKSApICU+JSANCiAgbGVmdF9qb2luKGNhbnRpZGFkZXNfZXhwb19oaWRyb19pbmRlYyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgtZXhwb19pbmRlY19jcnVkbykpICU+JSANCiAgZnVsbF9qb2luKGV4cG9fZ2FzX3NpdGMgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX2dhc19jb210cmFkZSA9IGV4cG9fTW0zLCB1bmlkYWQgPSB1bmlkYWRfY2FudGlkYWQgKSkgJT4lIA0KICAjIG11dGF0ZShkaWYgPSBleHBvX3Nlc2NvX2dhcy8gZXhwb19pbmRlY19nYXMgLSAxICkgJT4lDQogIG11dGF0ZShleHBvX2dhcyA9IGNhc2Vfd2hlbihhbmlvIDwgMTk5NyB+IGV4cG9fZ2FzX2NvbXRyYWRlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID4gMTk5NiB+ZXhwb19zZXNjb19nYXMgKSkgJT4lIA0KICBhcnJhbmdlKGFuaW8pICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXhwb19nYXMsIGV2ZXJ5dGhpbmcoLikpDQoNCmV4cG9fcV9nYXNfTU1CVFUgPC0gZXhwb19xX2dhcyAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc2VsZWN0KC1jKHVuaWRhZCkpICU+JSANCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7Y29udmVyc29yX20zTU1CVFVfcSh4KjEwMDApfSApICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJNTUJUVSIpDQoNCiNNZXJnZSB2YWxvcg0KZXhwb191c2RfZ2FzIDwtIGV4cG9fc2VzY29fdXNkX2dhcyAlPiUNCiAgbGVmdF9qb2luKGNvbWV4X2hpZHJvY2FyYnVyb3NfbWVjb24gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZXhwb19nYXNfbWVjb24gPSBleHBvX2dhc19NTXVzZCkgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoZXhwb19nYXNfbWVjb24gPSBleHBvX2dhc19tZWNvbiAqIDEwMDAwMDApKSAgJT4lIA0KICBsZWZ0X2pvaW4oZXhwb19oaWRyb192YWxvcl9pbmRlYyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX2dhc19pbmRlYyA9IGV4cG9faW5kZWNfZ2FzKSkgJT4lIA0KICBmdWxsX2pvaW4oZXhwb19nYXNfc2l0YyAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9fZ2FzX2NvbXRyYWRlID0gdHJhZGVfdmFsdWVfdXNkLCB1bmlkYWQgKSkgJT4lIA0KICAjIG11dGF0ZShkaWYgPSBleHBvX3Nlc2NvX2dhcy9leHBvX2dhc19pbmRlYyAtMSkgJT4lIA0KICBtdXRhdGUoZXhwb19nYXMgPSBjYXNlX3doZW4oYW5pbyA8IDE5OTcgfiBleHBvX2dhc19jb210cmFkZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+PSAxOTk3IH4gZXhwb19zZXNjb19nYXMpKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV4cG9fZ2FzLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogIGFycmFuZ2UoYW5pbykNCiAgDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KCBjYW50aWRhZGVzID0gZXhwb19xX2dhcywgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNkID0gZXhwb191c2RfZ2FzLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9fZXhwb195X3JlZmVyZW5jaWEgPSBwcmVjaW9fZXhwb195X21lX2dhcyksDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL2V4cG9fZ2FzLnhsc3giKQ0KDQojIGNvbWV4X2NydWRvX3Nlc2NvICU+JSBmaWx0ZXIodW5pZGFkID09ICJtMyIsIHZhcmlhYmxlID09ICJleHBvcnRhY2lvbiIpDQojIGNvbWV4X2dhcyAlPiUgZmlsdGVyKHVuaWRhZCA9PSAibTMiLCB2YXJpYWJsZSA9PSAiZXhwb3J0YWNpb24iKQ0KZXhwb19xX2dhcyANCmV4cG9fdXNkX2dhcw0KYGBgDQoNCg0KDQojIyBSZWdhbMOtYXMNCg0KKiBGdWVudGVzOiANCiAgKyBTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSAoQmFzZSBSZWdhbMOtYXMpDQoNCg0KUkVWSVNBUiBFTCBDQUxDVUxPIERFIEJFVEFOSUEgDQpjdWFudG8gZ2FuYXJpYW4gbGFzIHByb3ZpbmNpYXMgc2kgZWwgcHJlY2lvIGRlbCBtZXJjYWRvIGludGVybm8gc2UgYWNvbW9kYSBhbCBpbnRlcm5hY2lvbmFsPw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI3JlZ2FsaWFzDQojZmlsdHJvIGNvbiBwcm9kdWN0b3MNCnByb2R1Y3RvcyA8LSBsaXN0KCJjcnVkbyIsICJnYXMiLCAiZ2Fzb2xpbmEiLCAiZ2xwIikNCg0KI2xvb3AgcGFyYSBsZXZhbnRhciBsYXMgYmFzZXMNCmxpc3RhX3JlZ2FsaWFzID0gbGlzdCgpDQpmb3IoaSBpbiBwcm9kdWN0b3Mpew0KICByZWdhbGlhc19pIDwtIHJlYWRfZGVsaW0ocGFzdGUwKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL2RhdGFzZXRzL3JlZ2FsaWFzXyIsIGksICIuY3N2IiksIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSwgDQogICAgc2tpcCA9IDEpDQogIGxpc3RhX3JlZ2FsaWFzW1tpXV0gPC0gcmVnYWxpYXNfaQ0KfQ0KDQojYmFzZXMgaW5kaXZpZHVhbGVzDQpyZWdhbGlhc19jcnVkbyA8LSBsaXN0YV9yZWdhbGlhcyRjcnVkbyAlPiUgDQogIG11dGF0ZShtb25lZGEgPSAidXNkIiwNCiAgICAgICAgIHByb2R1Y3RvID0gImNydWRvIikNCnJlZ2FsaWFzX2dhcyA8LSBsaXN0YV9yZWdhbGlhcyRnYXMgJT4lIA0KICBtdXRhdGUobW9uZWRhID0gImFycyIsDQogICAgICAgICBwcm9kdWN0byA9ICJnYXMiKQ0KcmVnYWxpYXNfZ2Fzb2xpbmEgPC0gbGlzdGFfcmVnYWxpYXMkZ2Fzb2xpbmEgJT4lIA0KICBtdXRhdGUobW9uZWRhID0gInVzZCIsDQogICAgICAgICBwcm9kdWN0byA9ICJnYXNvbGluYSIpDQpyZWdhbGlhc19nbHAgPC0gbGlzdGFfcmVnYWxpYXMkZ2xwICU+JSANCiAgbXV0YXRlKG1vbmVkYSA9ICJhcnMiLA0KICAgICAgICAgcHJvZHVjdG8gPSAiZ2xwIikNCg0KI2Jhc2UgY29tcGxldGENCnJlZ2FsaWFzIDwtICByZWdhbGlhc19jcnVkbyAlPiUgDQogIGJpbmRfcm93cyhyZWdhbGlhc19nYXMsIHJlZ2FsaWFzX2dhc29saW5hLCByZWdhbGlhc19nbHApICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiQcORTyIsDQogICAgICAgICBtZXMgPSAiTUVTIiwgDQogICAgICAgICByZWdhbGlhc190b3RhbCA9ICJUT1RBTCBQUk9WSU5DSUEiKSAlPiUgDQogIG11dGF0ZShmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHBhc3RlMChhbmlvLCBtZXMpLCBvcmRlcnMgPSAieW0iKSkpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBhbmlvLCBtZXMsIHByb2R1Y3RvLCBtb25lZGEsIHJlZ2FsaWFzX3RvdGFsLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogIGdyb3VwX2J5KHByb2R1Y3RvLCBhbmlvLCBtb25lZGEgKSAlPiUgDQogIHN1bW1hcmlzZShyZWdhbGlhc190b3RhbCA9IHN1bShyZWdhbGlhc190b3RhbCkpICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbCAlPiUgc2VsZWN0KC1UQ1ApKSAlPiUgDQogIG11dGF0ZShyZWdhbGlhc190b3RhbCA9IGNhc2Vfd2hlbihtb25lZGEgPT0gInVzZCIgfiByZWdhbGlhc190b3RhbCAqIFRDQywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiByZWdhbGlhc190b3RhbCksDQogICAgICAgICB1bmlkYWQgPSAiYXJzIikgJT4lIA0KICBzZWxlY3QoLWMoVENDLCBtb25lZGEpKQ0KDQpyZWdhbGlhcw0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gocmVnYWxpYXMgJT4lIA0KIyAgIHNwcmVhZCguLA0KIyAgICAgICAgICBrZXkgPSBhbmlvLA0KIyAgICAgICAgICB2YWx1ZSA9IHJlZ2FsaWFzX3RvdGFsKSwgcGF0aCA9ICJyZXN1bHRhZG9zL3JlZ2FsaWFzLnhsc3giKQ0KYGBgDQoNCiMjIFN1YnNpZGlvcw0KYGBge3J9DQojIENFRklQIGNvbnQgZXQgYWwuIFN1YnNpZGlvcyBjb21vICUgZGVsIFBCSQ0Kc3Vic2lkaW9zX2NlZmlwIDwtIHJlYWRfZXhjZWwoIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL3N1YnNpZGlvcy9zdWJzaWRpb3MueGxzeCIpICU+JSANCiAgZ2F0aGVyKGtleSA9IGFuaW8sDQogICAgICAgICB2YWx1ZSA9IHN1YnNpZGlvc19wb3JjZW50YWplX3BiaSwNCiAgICAgICAgIDI6bmNvbCguKSkgJT4lIA0KICBmaWx0ZXIoc2VjdG9yICVpbiUgYygiQ0FNTUVTQSIsICJQbGFuIEdhcyIsIkVOQVJTQSIsICJTdWJzaWRpb3MgRkYgR04geSBHTFAiKSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGFzLmRvdWJsZShhbmlvKSkgJT4lIA0KICBsZWZ0X2pvaW4oZ2FuYW5jaWFfeV9wYmkgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcGJpKSkgJT4lDQogIG11dGF0ZShzdWJzaWRpb3NfcG9yY2VudGFqZV9wYmk9YXMuZG91YmxlKHN1YnNpZGlvc19wb3JjZW50YWplX3BiaSksDQogICAgICAgICBzdWJzaWRpb3NfY2VmaXAgPSBzdWJzaWRpb3NfcG9yY2VudGFqZV9wYmkgKiBwYmkgKiAxMF42KSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHVuaWRhZCA9ICJQZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgICAgIHN1YnNpZGlvc19jZWZpcD1zdW0oc3Vic2lkaW9zX2NlZmlwLCBuYS5ybSA9IFQpKQ0KDQojZWplcyANCnN1YnNpZGlvc19lamVzIDwtIHJlYWRfZXhjZWwoIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL3N1YnNpZGlvcy54bHN4IiApICU+JSANCiAgcmVuYW1lKHN1YnNpZGlvc191c2QgPSBzdWJzaWRpb3NfaGlkcm9jYXJidXJvcykgJT4lIA0KICByaWdodF9qb2luKHRjcF9hbnVhbF9iICU+JSANCiAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB0Y2MpLCBieSA9ICJhbmlvIikgJT4lDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHVuaWRhZCA9ICJQZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgIHN1YnNpZGlvc19lamVzID0gc3Vic2lkaW9zX3VzZCp0Y2MqMTBeNikNCg0Kc3Vic2lkaW9zX2hpZHJvY2FyYnVyb3MgPC0gc3Vic2lkaW9zX2VqZXMlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHN1YnNpZGlvc19lamVzKSAlPiUgDQogIGZ1bGxfam9pbihzdWJzaWRpb3NfY2VmaXAsIGJ5ID1jKCJhbmlvIiwgInVuaWRhZCIpKSAlPiUgDQogIGFycmFuZ2UoLWFuaW8pICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJQZXNvcyBjb3JyaWVudGVzIikNCiAgICAgICAgICMgeCA9IHN1YnNpZGlvc19jZWZpcC9zdWJzaWRpb3NfZWplcykNCnN1YnNpZGlvc19oaWRyb2NhcmJ1cm9zICANCmBgYA0KDQoNCiMjIFBvem9zDQoNCg0KIyMjIE1ldHJvcyBwZXJmb3JhZG9zDQoNCkZ1ZW50ZToNCg0KKiBbU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWFdKGh0dHBzOi8vZGF0b3MuZ29iLmFyL2RhdGFzZXQvZW5lcmdpYS1wZXJmb3JhY2lvbi1wb3pvcy1wZXRyb2xlby1nYXMpDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCm1ldHJvc19wZXJmb3JhZG9zX3Bvc3Rlcmlvcl9hbF8yMDA5IDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL3NlY3JldGFyaWEgZGUgZW5lcmdpYS9tZXRyb3MtcGVyZm9yYWRvcy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKGluZGljZV90aWVtcG8gPSBjb2xfZGF0ZShmb3JtYXQgPSAiJVktJW0iKSkpDQoNCm1ldHJvc19wZXJmb3JhZG9zX2FudGVyaW9yX2FsXzIwMDkgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3Mvc2VjcmV0YXJpYSBkZSBlbmVyZ2lhL21ldHJvcy1wZXJmb3JhZG9zLWFudGVyaW9yLWFsLTIwMDkuY3N2IikgJT4lIA0KICByZW5hbWUoY2FudGlkYWQgPSBDYW50aWRhZCkNCg0KbWV0cm9zX3BlcmZvcmFkb3NfZW1wcmVzYSA8LSBtZXRyb3NfcGVyZm9yYWRvc19wb3N0ZXJpb3JfYWxfMjAwOSAlPiUNCiAgYmluZF9yb3dzKG1ldHJvc19wZXJmb3JhZG9zX2FudGVyaW9yX2FsXzIwMDkpICU+JSANCiAgc2VsZWN0KGFuaW8sIG1lcywgaWRlbXByZXNhLCBlbXByZXNhLCBpZGNvbmNlcHRvLCBjb25jZXB0bywgY2FudGlkYWQsIG9ic2VydmFjaW9uZXMgKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIGlkZW1wcmVzYSwgZW1wcmVzYSkgJT4lDQogIHN1bW1hcmlzZShtZXRyb3NfcGVyZm9yYWRvcyA9IHN1bShjYW50aWRhZCwgbmEucm0gPSBUKSkgJT4lIA0KICB1bmdyb3VwKCkNCiAgDQoNCm1ldHJvc19wZXJmb3JhZG9zIDwtIG1ldHJvc19wZXJmb3JhZG9zX2VtcHJlc2EgJT4lDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKG1ldHJvc19wZXJmb3JhZG9zID0gc3VtKG1ldHJvc19wZXJmb3JhZG9zLCBuYS5ybSA9IFQpKSAlPiUNCiAgbXV0YXRlKGluZGljZV9tZXRyb3MgPSBnZW5lcmFyX2luZGljZShzZXJpZT0gbWV0cm9zX3BlcmZvcmFkb3MsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhID0gYW5pbywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9IDIwMDEpKSANCg0KZ3JhZl9tZXRyb3NfcGVyZm9yYWRvcyA8LSBtZXRyb3NfcGVyZm9yYWRvc19lbXByZXNhJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIG1ldHJvc19wZXJmb3JhZG9zLCBmaWxsID0gZW1wcmVzYSkpICsNCiAgZ2VvbV9jb2woKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkrDQogIGxhYnModGl0bGUgPSAiTWV0cm9zIHBlcmZvcmFkb3MgcG9yIGVtcHJlc2EiKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1mdW5jdGlvbih4KSBmb3JtYXQoeCwgYmlnLm1hcmsgPSAiLiIsIHNjaWVudGlmaWMgPSBGQUxTRSkpDQpnZ3Bsb3RseShncmFmX21ldHJvc19wZXJmb3JhZG9zLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KDQoNCiNsaXN0YWRvIGRlIGVtcHJlc2FzIGNvbiBzdXMgaWQncw0KbGlzdGFkb19lbXByZXNhIDwtIGRpc3RpbmN0KG1ldHJvc19wZXJmb3JhZG9zX2VtcHJlc2EgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoaWRlbXByZXNhLCBlbXByZXNhKSxpZGVtcHJlc2EsIC5rZWVwX2FsbCA9IFQpIA0KICANCg0KDQpgYGANCg0KDQoNCiMjIyBQb3pvcyBlbiBvcGVyYWNpw7NuDQoNCkZ1ZW50ZXM6DQoNCiogU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgLSBbRGF0b3MgTUlORU1dKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRvc21pbmVtL3Byb2R1Y2Npb24tZGUtcGV0cm9sZW8teS1nYXMtcG9yLXBvem8pOg0KICArIFtMaXN0YWRvIGRlIHBvem9zIGNhcmdhZG9zIHBvciBlbXByZXNhcyBvcGVyYWRvcmFzXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvcHJvZHVjY2lvbi1kZS1wZXRyb2xlby15LWdhcy1wb3ItcG96by9hcmNoaXZvL2NiZmE0ZDc5LWZmYjMtNDA5Ni1iYWI1LWViMGRkZTlhODM4NSk6IHNlIHRvbWEgbGEgdmFyaWFibGUgIkZlY2hhIGRlbCBGaW4gZGUgdGVybWluYWNpw7NuIGRlIHBlcmZvcmFjacOzbiBkZWwgcG96byIgKGFkaml2X2ZlY2hhX2Zpbl90ZXJtKSBjb21vIGHDsW8gZGUgcHVlc3RhIGVuIHByb2R1Y2Npw7NuIGRlbCBwb3pvLiBTZSBwb2Ryw61hIGVsYWJvcmFyIHVuIHN0b2NrIGRlIHBvem9zIGEgcGFydGlyIGRlIGFjdW11bGFyIGxvcyBwb3pvcyB0ZXJtaW5hZG9zIHkgcmVzdGFuZG8gbG9zIHBvem9zIGFiYW5kb25hZG9zLCBhZ3J1cGFuZG8gY29uIGxhIHZhcmlhYmxlICJGZWNoYSBkZSBhYmFuZG9ubyBkZWwgcG96byIoYWRqaXZfZmVjaGFfYWJhbmRvbm8pDQogICsgW1Bvem9zIHRlcm1pbmFkb3NdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9wZXJmb3JhY2lvbi1kZS1wb3pvcy1kZS1wZXRyb2xlby15LWdhcy9hcmNoaXZvL2EyY2UxNGFmLTVjNTYtNDVjMi05YjljLWM3YTFlNTE1NmRmZikNCiAgKyBbQ2Fww610dWxvIElWXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvcHJvZHVjY2lvbi1kZS1wZXRyb2xlby15LWdhcy1wb3ItcG96by9hcmNoaXZvL2NiNWMwZjA0LTc4MzUtNDVjZC1iOTgyLTNlMjVjYTdkNzc1MSkNCiAgKyBbRXN0YWRvIGRlIHBvem9zXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvZXN0YWRvLWRlLXBvem9zLWRlLXBldHJvbGVvLXktZ2FzKSAoQVVOIE5PIFNFIFBST0NFU8OTIEVTVEEgQkFTRSBOSSBMQSBBTlRFUklPUikgDQogICsgW1NFU0NPXShodHRwOi8vd3d3LmVuZXJnaWEuZ29iLmFyL2NvbnRlbmlkb3MvdmVycGFnaW5hLnBocD9pZHBhZ2luYT0xNjI0KQ0KKiBbSUFQR10oaHR0cHM6Ly93d3cuaWFwZy5vcmcuYXIvd2ViX2lhcGcvc2VjdG9yZXMvZXN0YWRpc3RpY2FzL3Byb2R1Y3Rvcy9saXN0YWRvcy9saXN0YWRvX3RvZG9zX2xvc19wcm9kdWN0b3MuaHRtKS4gU2UgcHJlc2VudGFuIGRvcyBzZXJpZXM6IHVuYSBlbGFib3JhZGEgYSBwYXJ0aXIgZGUgbG9zIHBvem9zIHBlcmZvcmFkb3MgcG9yIGHDsW8gKHJlc3VsdGFudGUgZGUgZGVzY2FyZ2FyIHVuYSBiYXNlIHBvciBjYWRhIGHDsW8gZGVsIHNpdGlvIHdlYiBvZmljaWFsKSB5IG90cmEgcXVlIGNvcnJlc3BvbmRlIGFsIHN0b2NrIGRlIHBvem9zIGRlIHBldHLDs2xlbyBkZSBleHRyYWNjacOzbiBlZmVjdGl2YSAocHJvY2VkZW50ZSBkZSBsb3MgZGF0b3MgZGUgRXN0YWTDrXN0aWNhcyBkZWwgQ2VudGVuYXJpbyBkZSBJQVBHKS4NCg0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0UsIG1lY2hvPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0NCiMgc2VjIGVuZXJnaWENCiMgcG96b3MgY2FyZ2Fkb3MgcG9yIGVtcHJlc2FzDQpsaXN0YWRvX3Bvem9zIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL2NhcGl0dWxvIGl2L2xpc3RhZG8tZGUtcG96b3MtY2FyZ2Fkb3MtcG9yLWVtcHJlc2FzLW9wZXJhZG9yYXMuY3N2IikgJT4lIA0KICBtdXRhdGUoYW5pb190ZXJtaW5hY2lvbl9wb3pvID15ZWFyKGFkaml2X2ZlY2hhX2Zpbl90ZXJtKSkgJT4lDQogIGxlZnRfam9pbihsaXN0YWRvX2VtcHJlc2EpICU+JSANCiAgZ3JvdXBfYnkoYW5pb190ZXJtaW5hY2lvbl9wb3pvLCBpZGVtcHJlc2EsIGVtcHJlc2EpICU+JSANCiAgc3VtbWFyaXNlKHBvem9zID0gbigpKSAlPiUgDQogIGZpbHRlcighaXMubmEoYW5pb190ZXJtaW5hY2lvbl9wb3pvKSkNCg0KDQogICMgbXV0YXRlKGVtcHJlc2EgPSBjYXNlX3doZW4oaWRlbXByZXNhID09ICJZUEYiIH4gIllQRiIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIlBBRSIgfiAiUEFFIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiWVNVUiIgfiAiWVNVUiIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIlBMVSIgfiAiUGx1c3BldHJvbCIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIlBMVUUiIH4gIlBsdXNwZXRyb2wiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJWSVMiIH4gIlZpc3RhIE9pbCBhbmQgR2FzIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiVFBUIiB+ICJUZWNwZXRyb2wiLCANCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiQ0dDIiB+ICJDR0MiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJXSU4iIH4gIldpbnRlcnNoYWxsIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiVEFVIiB+ICJUb3RhbCBBdXN0cmFsIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiWVNVUiIgfiAiWVNVUiIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIlNIRSIgfiAiU2hlbGwiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJDQVAiIH4gIkNhcGV4IiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiUFBBTSIgfiAiUGFtcGEiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+ICJPdHJhIikpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWRlbXByZXNhID09ICJQRVRST0JSQVMgQVJHRU5USU5BIFMuQS4iIH4gIlBldHJvYnJhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZGVtcHJlc2EgPT0gIlBFU0EgKFBFVFJPQlJBUyBFLlMuQS4pIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWRlbXByZXNhID09ICJFTkFQIFNJUEVUUk9MIEFSR0VOVElOQSBTLkEuIiB+ICJFTkFQIFNJUEVUUk9MIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkZW1wcmVzYSA9PSAiVklTVEEgT0lMICYgR0FTIEFSR0VOVElOQSBTQSIgfiAiVmlzdGEgT2lsIGFuZCBHYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWRlbXByZXNhID09ICJTSU5PUEVDIEFSR0VOVElOQSBFWFBMT1JBVElPTiBBTkQgUFJPRFVDVElPTiwgSU5DLiIgfiAiU2lub3BlYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZGVtcHJlc2EgPT0gIlBMVVNQRVRST0wgRU5FUkdZIFMuQS4iIH4gIlBsdXNwZXRyb2wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWRlbXByZXNhID09ICJZU1VSIFBFVFJPTEVSQSBBUkdFTlRJTkEgUy5BLiIgfiAiWVNVUiIpKQ0KDQpncmFmX3Bvem9zX3NlY19lbmVyZ2lhIDwtIGxpc3RhZG9fcG96b3MgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW9fdGVybWluYWNpb25fcG96bywgcG96b3MsIGZpbGwgPSBlbXByZXNhKSkrDQogIGdlb21fY29sKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBsYWJzKHRpdGxlID0gIlBvem9zIGNhcmdhZG9zIHBvciBlbXByZXNhcyBvcGVyYWRvcmFzIChwb3IgYcOxbyBkZSB0ZXJtaW5hY2nDs24pIiwNCiAgICAgICBjYXB0aW9uID0gIlNlY3JldGFyw61hIGRlIEVuZXJnw61hIikNCmdncGxvdGx5KGdyYWZfcG96b3Nfc2VjX2VuZXJnaWEsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KICANCnBvem9zX3Rlcm1pbmFkb3NfYW50ZXJpb3JfYWxfMjAwOSA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9zZWNyZXRhcmlhIGRlIGVuZXJnaWEvcG96b3MtdGVybWluYWRvcy1hbnRlcmlvci1hbC0yMDA5LmNzdiIpICU+JSANCiAgcmVuYW1lKGNhbnRpZGFkID0gQ2FudGlkYWQpDQoNCnBvem9zX3Rlcm1pbmFkb3MgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3Mvc2VjcmV0YXJpYSBkZSBlbmVyZ2lhL3Bvem9zLXRlcm1pbmFkb3MuY3N2IikgJT4lIA0KICBiaW5kX3Jvd3MocG96b3NfdGVybWluYWRvc19hbnRlcmlvcl9hbF8yMDA5KSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIGlkZW1wcmVzYSwgZW1wcmVzYSApICU+JSANCiAgc3VtbWFyaXNlKHBvem9zICA9IHN1bShjYW50aWRhZCwgbmEucm0gPSBUKSkNCg0KDQpncmFmX3Bvem9zX3Rlcm1pbmFkb3MgPC0gcG96b3NfdGVybWluYWRvcyAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLCBwb3pvcyAsIGZpbGwgPSBlbXByZXNhKSkrDQogIGdlb21fY29sKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBsYWJzKHRpdGxlID0gIkNhbnRpZGFkIGRlIHBvem9zIHRlcm1pbmFkb3MiLA0KICAgICAgIGNhcHRpb24gPSAiU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEiKQ0KZ2dwbG90bHkoZ3JhZl9wb3pvc190ZXJtaW5hZG9zLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNwb3pvcyBpYXBnIChiYXNlcyBhbnVhbGVzKQ0KcG96b19pYXBnXzA1IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAwNS54bHMiLCANCiAgICBza2lwID0gMSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMDUpICU+JSANCiAgZ3JvdXBfYnkoT3BlcmFkb3IpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpDQoNCnBvem9faWFwZ18wNiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMDYueGxzIiwgDQogICAgc2tpcCA9IDEpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDA2KSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMDcgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDA3LnhscyIsIA0KICAgIHNraXAgPSAxKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAwNykgJT4lIA0KICBncm91cF9ieShPcGVyYWRvcikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcG96b19pYXBnXzA4IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAwOC54bHMiLCANCiAgICBza2lwID0gMikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMDgpICU+JSANCiAgZ3JvdXBfYnkoT3BlcmFkb3IpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpDQoNCnBvem9faWFwZ18wOSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMDkueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDA5KSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMTAgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDEwLnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAxMCkgJT4lIA0KICBncm91cF9ieShPcGVyYWRvcikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcG96b19pYXBnXzEyIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAxMi54bHMiLCANCiAgICBza2lwID0gMikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMTIpICU+JSANCiAgZ3JvdXBfYnkoT3BlcmFkb3IpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpDQoNCnBvem9faWFwZ18xMyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMTMueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDEzKSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMTQgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDE0LnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAxNCkgJT4lIA0KICBncm91cF9ieShPcGVyYWRvcikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcG96b19pYXBnXzE1IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAxNS54bHMiLCANCiAgICBza2lwID0gMikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMTUpICU+JSANCiAgZ3JvdXBfYnkoT3BlcmFkb3IpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpDQoNCnBvem9faWFwZ18xNiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMTYueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDE2KQ0KDQpwb3pvX2lhcGdfMTcgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDE3LnhscyIsIA0KICAgIHNraXAgPSAyKSAgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMTcpDQoNCnBvem9faWFwZ18xOCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMTgueGxzIiwgDQogICAgc2tpcCA9IDIpICAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAxOCkNCg0KcG96b19pYXBnXzE5IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAxOS54bHMiLCANCiAgICBza2lwID0gMikgICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDE5KSAlPiUgDQogIHJlbmFtZSgiVG90YWwgUG96b3MiID0gIlRvdGFsIFBvem9zIFRlcm1pbmFkb3MiKQ0KDQojc2UgbWUgY29sYXJvbiBhbGd1bmFzIGZpbGFzIGRlIHRvdGFsZXMgcXVlIGhheSBxdWUgYm9ycmFyDQpwb3pvc19pYXBnIDwtIHBvem9faWFwZ18wNSAlPiUgDQogIGJpbmRfcm93cyhwb3pvX2lhcGdfMDYsIHBvem9faWFwZ18wNywgcG96b19pYXBnXzA4LCBwb3pvX2lhcGdfMDksIA0KICAgICAgICAgICAgcG96b19pYXBnXzEwLCBwb3pvX2lhcGdfMTIsIHBvem9faWFwZ18xMywgcG96b19pYXBnXzE0LCBwb3pvX2lhcGdfMTUsDQogICAgICAgICAgICBwb3pvX2lhcGdfMTYsIHBvem9faWFwZ18xNywgcG96b19pYXBnXzE4LCBwb3pvX2lhcGdfMTkpICU+JQ0KICByZW5hbWUodG90YWxfcG96b3MgPSAgIlRvdGFsIFBvem9zIikgJT4lIA0KICBmaWx0ZXIoIShPcGVyYWRvciAlaW4lIGMoIlRvdGFsZXMiLCAiVE9UQUwiKSkgJiAhKGlzLm5hKE9wZXJhZG9yKSkgKSAlPiUgDQogIG11dGF0ZShlbXByZXNhID1jYXNlX3doZW4oT3BlcmFkb3IgPT0gIllQRiBTLkEuIiB+ICJZUEYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJQQU4gQU1FUklDQU4gRU5FUkdZIChTVUNVUlNBTCBBUkdFTlRJTkEpIExMQyIgfiAiUEFFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiUEFOIEFNRVJJQ0FOIEVORVJHWSBTTCIgfiAiUEFFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiUEFOIEFNRVJJQ0FOIiB+ICJQQUUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJQRVRST0JSQVMgQVJHRU5USU5BIFMuQS4iIH4gIlBldHJvYnJhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlBFU0EgKFBFVFJPQlJBUyBFLlMuQS4pIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJURUNQRVRST0wgUy5BLiIgfiAiVGVjcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiUExVU1BFVFJPTCBTLkEuIiB+ICJQbHVzcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiU0lOT1BFQyBBUkdFTlRJTkEgRVhQTE9SQVRJT04gSU5DIiB+ICJTaW5vcGVjIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiQ09NUEHDkcONQSBHRU5FUkFMIERFIENPTUJVU1RJQkxFUyBTLkEuIiB+ICJDR0MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJWSVNUQSBPSUwgJiBHQVMgQVJHRU5USU5BIFNBIiB+ICJWaXN0YSBPaWwgYW5kIEdhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlZJU1RBIE9JTCAmIEdBUyBBUkdFTlRJTkEgU0FVIiB+ICJWaXN0YSBPaWwgYW5kIEdhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIldJTlRFUlNIQUxMIEVORVJHSUEgUy5BLiIgfiAiV2ludGVyc2hhbGwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJFTkFQIFNJUEVUUk9MIEFSR0VOVElOQSBTLkEuIiB+ICJFTkFQIFNJUEVUUk9MIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiWVNVUiBFTkVSR8ONQSBBUkdFTlRJTkEgUy5SLkwuIiB+ICJZU1VSIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiWVNVUiBQRVRST0xFUkEgQVJHRU5USU5BIFMuQSIgfiAiWVNVUiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlRPVEFMIEFVU1RSQUwgUy5BLiIgfiAiVG90YWwgQXVzdHJhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IE9wZXJhZG9yKSkgJT4lDQogIGZpbHRlcighaXMubmEoZW1wcmVzYSkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KGVtcHJlc2EsIGFuaW8sdG90YWxfcG96b3MpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgZW1wcmVzYSkgJT4lIA0KICBzdW1tYXJpc2UodG90YWxfcG96b3MgPSBzdW0odG90YWxfcG96b3MpKSAlPiUgDQogIGFycmFuZ2UoYW5pbykNCnBvem9zX2lhcGcNCg0KZ3JhZl9wb3pvc19pYXBnIDwtIHBvem9zX2lhcGcgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHRvdGFsX3Bvem9zLCBmaWxsID0gZW1wcmVzYSkpKw0KICBnZW9tX2NvbCgpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgbGFicyh0aXRsZSA9ICJQb3pvcyBwZXJmb3JhZG9zIiwNCiAgICAgICBjYXB0aW9uID0gIklBUEciKQ0KZ2dwbG90bHkoZ3JhZl9wb3pvc19pYXBnLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNwb3pvcyBpYXBnIGFjdW11bGFkb3MNCnBvem9zX2lhcGdfY2VudGVuYXJpbyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvcG96b3NfaWFwZ19jZW50ZW5hcmlvLmNzdiIsICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICByZW5hbWUodG90YWxlcyA9IHRvdGFsZSkNCg0KZ3JhZl9wb3pvc19pYXBnX2NlbnRlbmFyaW8gPC0gcG96b3NfaWFwZ19jZW50ZW5hcmlvICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB0b3RhbGVzKSkrDQogIGdlb21fY29sKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBsYWJzKHRpdGxlID0gIlBvem9zIGVuIGV4dHJhY2Npw7NuIGRlZmluaXRpdmEiLA0KICAgICAgIGNhcHRpb24gPSAiSUFQRyIpDQpnZ3Bsb3RseShncmFmX3Bvem9zX2lhcGdfY2VudGVuYXJpbywgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCg0KDQojIGNvbXBhcmFjaW9uIGRlIGZ1ZW50ZXMNCmNvbXBhcmFjaW9uX3Bvem9zIDwtIHBvem9zX2lhcGcgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShwb3pvc19wZXJmb3JhZG9zX2lhcGcgPSBzdW0odG90YWxfcG96b3MsIG5hLnJtID0gVCkpICU+JSANCiAgcmlnaHRfam9pbihwb3pvc190ZXJtaW5hZG9zICU+JQ0KICAgICAgICAgICAgICAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvem9zX3Rlcm1pbmFkb3Nfc2VjX2VuZXJnaWEgPSBzdW0ocG96b3MsIG5hLnJtID0gVCkpKSAlPiUgDQogIHJpZ2h0X2pvaW4obGlzdGFkb19wb3pvcyAlPiUgDQogICAgICAgICAgICAgICAgcmVuYW1lKGFuaW8gPSBhbmlvX3Rlcm1pbmFjaW9uX3Bvem8pICU+JSANCiAgICAgICAgICAgICAgICBncm91cF9ieShhbmlvKSAlPiUgDQogICAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvem9zX2NhcmdhZG9zX3NlY19lbmVyZ2lhID0gc3VtKHBvem9zLCBuYS5ybSA9IFQpKSkgJT4lIA0KICBmdWxsX2pvaW4ocG96b3NfaWFwZ19jZW50ZW5hcmlvICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKHZhcmlhY2lvbl9wb3pvcyA9IHZhcmlhY2lvbl9pbnRlcmFudWFsKHRvdGFsZXMpKSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHBvem9zX3ZhcmlhY2lvbl9pYXBnID0gdmFyaWFjaW9uX3Bvem9zKSkgDQoNCg0KZ3JhZl9wb3pvcyA8LSBjb21wYXJhY2lvbl9wb3pvcyAlPiUNCiAgZ2F0aGVyKGtleSA9ICJmdWVudGUiLA0KICAgICAgICAgdmFsdWUgPSAidmFsb3IiLA0KICAgICAgICAgMjpuY29sKC4pKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gZnVlbnRlKSkrDQogIGdlb21fbGluZSgpKw0KICAjIGdlb21fcG9pbnQoKSsNCiAgeWxpbSgwLCAxNzAwICkrDQogIGxhYnModGl0bGUgPSAiUG96b3MuIENvbXBhcmFjacOzbiBkZSBmdWVudGVzIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KZ2dwbG90bHkoZ3JhZl9wb3pvcywgd2lkdGggPSA4MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KDQoNCnZlciByZWxhY2lvbmVzDQoqIFBCSSBoaWRyb2NhcmJ1cm9zIC8gUEJJIHRvdGFsICh2ZXIgY3VhbCBlbGVnaXIpDQoqIGNvcnJlZ2lyIG51ZXN0cm8gVkJQIGRlcHVyYW5kbyBzZXJ2aWNpb3MNCiogTUlQJ3MgY29lZiB0ZWNuaWNvIChwYXJhIHZlciBDSSBlbiBlbCBzZWN0b3IgcGV0cm9sZXJvIHkgcGVzbyBkZWwgc2VjdG9yIHBldHJvbGVybyBlbiBQQkkpDQoNCiogc3RvY2sgcGV0cm9sZXJvIC8gc3RvY2sgdG90YWwgSklDLEVNIA0KKiBTdG9jayBleHRyYWNjaW9uID0gUFB5RSBQQUUgKyBQUHlFIFRlY3AgKyBQUHlFIFBldHJvYnJhcyB1cHN0ciArIEFjdGl2byBZUEYgdXBzdHJlYW0NCiAgKiB2ZXIgcXVlIHBvcmNlbnRhamUgcXVlIHJlcHJlc2VudGFuIGVzdGFzIGVtcHJlc2FzIGVuIGxhIHByb2R1Y2Npb24gbyBwb3pvcyB5IHZlciBkZSBhbXBsaWFybG8gDQogICogdmVyIHJlbGFjaW9uIEFjdGl2byBZUEYgdXBzdHJlYW0gLyBQUHlFIGludGVncmFkYSBZUEYNCiAgKiB2ZXIgcmVsYWNpb24gZ2FuYW5jaWFzIEFGSVAgeSBCT0xTQVIgY29uIGVsIHN0b2NrIGNvcnJlc3BvbmRpZW50ZSAoY29oZXJlbmNpYSkgDQogICogdmVyIHJlbGFjaW9uIGNvbiBDb3JlbWJlcmcNCiAgKiBwYXNhciBFTkdFIA0KDQoqZ3JpbmJlcmcNCiAgKiBjb252ZXJ0aXIgbG8gbnVlc3RybyBhIGNvc3Rvcy4gYWdhcnJhciBudWVzdHJvcyB2YWxvciB5IGRpdmlkaXJsbyBwb3IgYmFycmlsZXMgKHN1bWFuZG8gZ2FzIGVuIEJPRSkNCiAgKiBjb3N0b3MgcG9yIGJibCwgcHJlY2lvIGVsIGJhcnJpbCB5IHByZWNpbyBkZSBwcm9kdWNjaW9uIChzdW1vIGxhIGdjaWEgbm9ybWFsIGFsIGNvc3RvMSkNCg0KDQojIyBBY3Rpdm9zDQoNClBhc2FyIGRhdG9zIGRlIGJzIGRlIHVzbyBlbiB5YWNpbWllbnRvcyBwYXJhIGFybWFyIHJlbGFjacOzbiBhY3Rpdm8geWFjaW1laW50by90b3RhbA0KDQpGdWVudGVzOg0KDQoqIEJhbGFuY2VzIGRlIEJvbHNhciAodW5pY2FtZW50ZSBlbXByZXNhcyBxdWUgY290aXphbiBlbiBsYSBib2xzYSBkZSB2YWxvcmVzIGFyZ2VudGluYSkuIFJldmlzYXIgZWwgc3RvY2sgZGVsIHNlY3RvciBkaXN0cmlidWNpw7NuIHBvcnF1ZSBzZSBwcmVzZW50YSBkZW1hc2lhZG8gZ3JhbmRlIGNvbiByZXNwZWN0byBhbCBkZSBsb3MgZGVtw6FzLiBGYWx0YSBwYXNhciBsb3MgZGF0b3MgZGVsIGFjdGl2byBkZSBjYXNpIHRvZGFzIGxhcyBlbXByZXNhcw0KKiBBRklQLiBDb24gZXN0YSBmdWVudGUgbm8gdGVuZW1vcyBjYWxjdWxvIGRlIHJlbnRhLCBzaW5vIHF1ZSBzb2xvIHVzYW1vcyBsYSBURyBjb21vIHBhcsOhbWV0cm8uIE5vdGE6ICJfYyIgc2lnbmlmaWNhIGNhc29zIHByZXNlbnRhZG9zIGRlIGxhIHZhcmlhYmxlIGNvcnJlc3BvbmRpZW50ZQ0KKiBNZW1vcmlhcyBkZSBZUEYuIExhIGTDqWNhZGEgZGUgbG9zIDgwIHByZXNlbnRhIHBpY29zIHF1ZSBoYXkgcXVlIHJldmlzYXINCg0KDQoqIENhbGN1bG8gZGVsIENhcGl0YWwgVG90YWwgQWRlbGFudGFkbyAoS1RBKSANCg0KICArIEJvbHNhcjogRXMgZXF1aXZhbGVudGUgYSBsYSBzdW1hIGRlIFByb3BpZWRhZCwgUGxhbnRhIHkgRXF1aXBvcyBOZXRhIChkZXNjb250YW5kbyBsb3MgdGVycmVub3MgeSBvYnJhcyBlbiBjdXJzbykgeSBsb3MgSW52ZW50YXJpb3MuIEN1YW5kbyBsb3MgZGF0b3MgbG8gaGFiaWxpdGFuLCBzZSBsZSBhZ3JlZ8OzIGxvcyBzYWxhcmlvcyBhZGVsYW50YWRvcyAoc2FsYXJpb3MgeSBjYXJnYXMgY29uc3VtaWRvcyBzb2JyZSByb3RhY2nDs24pLiBMdWVnbywgY3VhbmRvIG5vIHNlIHByZXNlbnRhcm9uIGRhdG9zIGRlIFByb3BpZWRhZCwgUGxhbnRhIHkgRXF1aXBvcywgc2UgdG9tw7MgZWwgYWN0aXZvIG5vIGNvcnJpZW50ZS4NCiAgKyBBRklQOiBFcyBlcXVpdmFsZW50ZSBhIGxhIHN1bWEgZGUgQmllbmVzIGRlIFVzbywgQmllbmVzIGRlIENhbWJpbywgSW52ZW50YXJpb3MgeSBEaXNwb25pYmlsaWRhZGVzLg0KICArIE1lbW9yaWEgWVBGOiBTdW1hIGRlIEJpZW5lcyBkZSBVc28geSBCaWVuZXMgZGUgQ2FtYmlvDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBCT0xTQVINCg0KI3NlZ21lbnRvcyBkZSBZUEYgeSBQZXRyb2JyYXMNCnlwZl9zZWcgPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvQmFsYW5jZXMvZ2FzIHkgcGV0cm9sZW9fZGF0b3MvZGF0b3Nfci95cGZfc2VnbWVudG9zLmNzdiIsIA0KICAgICIsIiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICBzZWxlY3QoLVgxKSAlPiUgDQogIG11dGF0ZShzZWN0b3IgPSBjYXNlX3doZW4oIHNlY3RvciA9PSAgInF1aW1pY2EiIH4gInBldHJvcXVpbWljYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBzZWN0b3IpLA0KICAgICAgICAgYW5pbyA9IHllYXIoZmVjaGEpKQ0KDQpwZXRyb2JyYXNfYXJfc2VnIDwtIHJlYWRfZGVsaW0oIkM6L0FyY2hpdm9zL0RhdG9zL0JhbGFuY2VzL2dhcyB5IHBldHJvbGVvX2RhdG9zL2RhdG9zX3IvcGV0cm9icmFzX2FyZ19zZWdtZW50b3MuY3N2IiwgDQogICAgIiwiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSU+JSANCiAgc2VsZWN0KC1YMSkNCg0KdW5pb25fc2VnbWVudG9zIDwtIHlwZl9zZWcgJT4lIA0KICBzZWxlY3QoYW5pbywgZW1wcmVzYSxzZWN0b3IsIHVuaWRhZCwgYWN0aXZvID0gYWN0aXZvcykgJT4lIA0KICBiaW5kX3Jvd3MocGV0cm9icmFzX2FyX3NlZyAlPiUgDQogICAgICAgICAgICAgIHJlbmFtZShhbmlvID0gZmVjaGEpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8gLCBlbXByZXNhLCB1bmlkYWQsIHNlY3RvciwgcHJvcF9wbGFudGFfZXF1aXBvID0gcHB5ZSwgYWN0aXZvID0gYWN0aXZvcykpICU+JSANCiAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDU6bmNvbCguKSkgJT4lDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9dmFsb3IvaXBjXzE4LA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiKSAlPiUgDQogIHNlbGVjdCgtaXBjXzE4KQ0KDQpzdG9ja19zZWdtZW50b3MgPC0gdW5pb25fc2VnbWVudG9zICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgc2VjdG9yLCB2YXJpYWJsZSAsdW5pZGFkICkgJT4lIA0KICBzdW1tYXJpc2UodmFsb3IgPSBzdW0odmFsb3IsIG5hLnJtID0gVCkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKGZ1ZW50ZSA9ICJBY3Rpdm8gZGUgWVBGIHkgUGV0cm9icmFzIiwNCiAgICAgICAgIHZhcmlhYmxlX3NlY3RvciA9IHBhc3RlKHZhcmlhYmxlLCBzZWN0b3IsIHNlcCA9ICIgIikpDQoNCg0KIyMgU3RvY2sgcG9yIGVtcHJlc2FzDQpzdG9ja19iYWxhbmNlc19lbXByZXNhcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvQmFsYW5jZXMvZ2FzIHkgcGV0cm9sZW9fZGF0b3MvZGF0b3Nfci9yZXN1bHRhZG9zL2JhbGFuY2VzX2FyZy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpICU+JSANCiAgZmlsdGVyKCAhKGVtcHJlc2EgJWluJSBjKCJjaGV2cm9uX2dsb2JhbCIsICJwZXRyb2JyYXNfZ2xvYmFsIiApKSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiLA0KICAgICAgICAgYW5pbyA9IHllYXIoZmVjaGEpLA0KICAgICAgICAgZnVlbnRlID0gIkJvbHNhciIpICU+JQ0KICBzZWxlY3QoYW5pbyxmdWVudGUsIGV2ZXJ5dGhpbmcoLiksIC1jKGZlY2hhLCBwYWlzLCB0Z19hbnQsIHRnX2Rlc3AsIHJvdGFjaW9uKSkgJT4lIA0KICAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDY6bmNvbCguKSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSB2YWxvciAvaXBjXzE4LA0KICAgICAgICAgZW1wcmVzYSA9IGNhc2Vfd2hlbihlbXByZXNhID09ICJwZXRyb2JyYXNfYXIiIH4gIlBldHJvYnJhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gInRlY3BldHJvbCIgfiAiVGVjcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiY2FtdXp6aV9wYW1wIiB+ICJDYW11enppIEdhcyBQYW1wZWFuYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIm1ldHJvZ2FzIiB+ICJNZXRyb2dhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBlbXByZXNhKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCBlbXByZXNhLGZ1ZW50ZSwgc2VjdG9yLCB1bmlkYWQsIHZhcmlhYmxlKSAlPiUNCiAgc3VtbWFyaXNlKHZhbG9yID0gc3VtKHZhbG9yLCBuYS5ybSA9IFQpKSAlPiUNCiAgZmlsdGVyKHZhcmlhYmxlICVpbiUgYygiS1RBIiwgInBweWUiLCAicHB5ZV9uZXRhIiAsICJpbnZlbnRhcmlvcyIsICJhY3Rpdm9fbm9fY29yciIsICJhY3Rpdm8iKSkNCiAgICANCg0KDQojIyBTdG9jayBwb3IgcmFtYQ0Kc3RvY2tfYmFsYW5jZXNfcmFtYSA8LSAgc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGJpbmRfcm93cyhzdG9ja19zZWdtZW50b3MgJT4lIA0KICAgICAgICAgICAgICAjIGZpbHRlcihzZWN0b3IgPT0gInVwc3RyZWFtIiAmIHZhcmlhYmxlID09ICJhY3Rpdm8iKSAlPiUNCiAgICAgICAgICAgICAgZmlsdGVyKHZhcmlhYmxlX3NlY3RvciA9PSAiYWN0aXZvIHVwc3RyZWFtIikgJT4lDQogICAgICAgICAgICAgIHNlbGVjdCgtdmFyaWFibGVfc2VjdG9yKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKHNlY3RvciA9IGNhc2Vfd2hlbihzZWN0b3IgPT0gInVwc3RyZWFtIiB+ICJwcm9kdWNjaW9uIiksDQogICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSA9ICBjYXNlX3doZW4odmFyaWFibGUgPT0gImFjdGl2byIgfiAicHB5ZSIpLA0KICAgICAgICAgICAgICAgICAgICAgZnVlbnRlID0gIkJvbHNhciIsDQogICAgICAgICAgICAgICAgICAgICBlbXByZXNhID0iWVBGIHkgUGV0cm9icmFzIikpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgc2VjdG9yLHZhcmlhYmxlLCB1bmlkYWQsIGZ1ZW50ZSkgJT4lDQogIHN1bW1hcmlzZSh2YWxvciA9IHN1bSh2YWxvciwgbmEucm0gPSBUKSkgIA0KICANCiAgIyBzcHJlYWQoa2V5ID0gc2VjdG9yLA0KICAjICAgICAgICB2YWx1ZSA9IEtUQSkgJT4lIA0KICAjIG11dGF0ZShpbnRlZ3JhZGFfeV9leHRyYWNjaW9uID0gaW50ZWdyYWRhICsgcHJvZHVjY2lvbiwNCiAgIyAgICAgICAgdmFyaWFibGUgPSAiS1RBIikgJT4lIA0KICAjIHJlbmFtZShleHRyYWNjaW9uID0gcHJvZHVjY2lvbikgJT4lIA0KICAjIHNlbGVjdChhbmlvLCB2YXJpYWJsZSwgbW9uZWRhLCBldmVyeXRoaW5nKC4pKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBUYXNhcyBkZSBkZXByZWNpYWNpb24NCiNBRklQDQp0YXNhX2RlcHJlY2lhY2lvbl9hZmlwIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0FGSVAvZ2NpYV92OC54bHN4IiwgDQogICAgc2tpcCA9IDQpICU+JQ0KICBzZWxlY3QoLWMoNDk6bmNvbCguKSkpICU+JSANCiAgZ3JvdXBfYnkoIHJhbWEsIHllYXIpICU+JSANCiAgc3VtbWFyaXNlKHRhc2FfZGVwcmVjaWFjaW9uID0gZGVwcmVjaWFjaW9uYnN1c28vYnN1c28pDQojQmFsYW5jZXMNCnJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9CYWxhbmNlcy9nYXMgeSBwZXRyb2xlb19kYXRvcy9kYXRvc19yL3Jlc3VsdGFkb3MvYmFsYW5jZXNfYXJnLmNzdiIsIA0KICAgICAgICAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKSAlPiUNCiAgICBmaWx0ZXIoZW1wcmVzYSA9PSAiWVBGIikgJT4lIA0KICAgIGdyb3VwX2J5KGVtcHJlc2EpICU+JSANCiAgICBtdXRhdGUodGFzYV9kZXByZWNpYWNpb24gPSBkZXByZWNpYWNpb25lcy9wcHllKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgZW1wcmVzYSwgdGFzYV9kZXByZWNpYWNpb24pDQoNCg0KIyMjQUZJUA0KIyBTdG9jayBkZSBiYWxhbmNlcyAtICBBRklQDQpkYXRvc19hZmlwIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0FGSVAvZ2NpYV92OC54bHN4IiwgDQogICAgc2tpcCA9IDQpICU+JQ0KICBzZWxlY3QoLWMoNDk6bmNvbCguKSkpICAlPiUgDQogIHJlbmFtZShhbmlvID0geWVhciwNCiAgICAgICAgIGlkc2VjdG9yID0gaWRyYW1hKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAicGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICBzZWN0b3IgPSBjYXNlX3doZW4oIHJhbWEgPT0gInBldHJvIiB+ICJleHRyYWNjaW9uX3BldHJvbGVvX2dhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByYW1hID09ICJzZXJfcGV0cm8iIH4gInNlcnZpY2lvc19wZXRyb2xlcm9zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiByYW1hKSklPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGlkc2VjdG9yLCBzZWN0b3IsIGV2ZXJ5dGhpbmcoLiksIC1yYW1hKQ0KZGF0b3NfYWZpcA0KDQoNCnN0b2NrX2FmaXAgPC0gZGF0b3NfYWZpcCAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIGlkc2VjdG9yLCBzZWN0b3IsIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2UoS1RBID0gZGlzcG9uaWJpbGlkYWRlcyArIGJzY2FtYmlvICsgaW52ZW50YXJpb3MgKyBic3VzbywNCiAgICAgICAgICAgIHBweWUgPSBzdW0oYnN1c28sIG5hLnJtID0gVCksDQogICAgICAgICAgICBhY3Rpdm8gPSBzdW0oYWN0aXZvLCBuYS5ybSA9IFQpKSAlPiUNCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JQ0KICBtdXRhdGUoS1RBID0gKEtUQS8xMF42KSAvIGlwY18xOCwNCiAgICAgICAgIHBweWU9IChwcHllLzEwXjYpIC8gaXBjXzE4LA0KICAgICAgICAgYWN0aXZvPSAoYWN0aXZvLzEwXjYpIC8gaXBjXzE4LA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiKSAlPiUgDQogIGFycmFuZ2UoaWRzZWN0b3IpICU+JSANCiAgZmlsdGVyKHNlY3RvciAlaW4lIGMoImV4dHJhY2Npb25fcGV0cm9sZW9fZ2FzIiwgInNlcnZpY2lvc19wZXRyb2xlcm9zIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoLWMoaWRzZWN0b3IsIGlwY18xOCkpICU+JSANCiAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDQ6bmNvbCguKSkgJT4lIA0KICBtdXRhdGUoZnVlbnRlID0gIkFGSVAiKQ0Kc3RvY2tfYWZpcA0KDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyANCiMgTWVtb3JpYXMgWVBGIA0KYmFsYW5jZV95cGYgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9FeGNlbHMgZGUgQmV0YW5pYS9DYWxjdWxvcyBCZXRhbmlhIFRnLnhscyIsIA0KICAgIHNoZWV0ID0gIllQRl9BICRIT1lfUEFSQURFRkxBQ1lDQUxDVUxBUiIsIA0KICAgIHNraXAgPSAxKSAlPiUgDQogIHNlbGVjdCgtYygxMjpuY29sKC4pKSkgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw7FvIiwNCiAgICAgICAgIHVuaWRhZCA9IG1vbmVkYSwNCiAgICAgICAgIHZlbnRhcyA9ICJWZW50YXMuLi4zIiwNCiAgICAgICAgIGNvc3RvX3ZlbnRhcyA9ICJDb3N0byBkZSBsYXMgVmVudGFzLi4uNCIsDQogICAgICAgICB1dGlsaWRhZF9uZXRhID0gIlV0aWxpZGFkIG5ldGEiLA0KICAgICAgICAgdXRpbGlkYWRfb3BlcmF0aXZhID0gIlV0aWxpZGFkIG9wZXJhdGl2YSIsDQogICAgICAgICBwcHllID0gIkJzIFVzbyIsDQogICAgICAgICBiaWVuZXNfZGVfY2FtYmlvID0gIkJzIENhbWJpbyIsDQogICAgICAgICB1dGlsaWRhZF9uZXRhX2FudGVzX2ltcHVlc3RvcyA9ICJVTiBhbnRlcyBkZSBpbXB1ZXN0b3MgKGfCtCBhY3Rpdm9zIHkgZGl2aWRlbmRvcykiLA0KICAgICAgICAgYWN0aXZvID0gIkFjdGl2byBUb3RhbCIsDQogICAgICAgICBwYXRyaW1vbmlvX25ldG8gPSAiUGF0cmltb25pbyBOZXRvIikgJT4lDQogIGZpbHRlcighKGlzLm5hKGFuaW8pKSkgJT4lDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge3ggLyAxMF42fSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUNCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyAgZGUgMjAxOCIsDQogICAgICAgICB2ZW50YXMgPXZlbnRhcy9pcGNfMTgsDQogICAgICAgICBjb3N0b192ZW50YXMgPSBjb3N0b192ZW50YXMvaXBjXzE4LA0KICAgICAgICAgdXRpbGlkYWRfbmV0YSA9IHV0aWxpZGFkX25ldGEvaXBjXzE4LA0KICAgICAgICAgdXRpbGlkYWRfb3BlcmF0aXZhID0gdXRpbGlkYWRfb3BlcmF0aXZhL2lwY18xOCwNCiAgICAgICAgIHBweWUgPSBwcHllL2lwY18xOCwNCiAgICAgICAgIGJpZW5lc19kZV9jYW1iaW8gPSBiaWVuZXNfZGVfY2FtYmlvL2lwY18xOCwNCiAgICAgICAgIHV0aWxpZGFkX25ldGFfYW50ZXNfaW1wdWVzdG9zID0gdXRpbGlkYWRfbmV0YV9hbnRlc19pbXB1ZXN0b3MvaXBjXzE4LA0KICAgICAgICAgYWN0aXZvID0gYWN0aXZvL2lwY18xOCwNCiAgICAgICAgIHBhdHJpbW9uaW9fbmV0byA9IHBhdHJpbW9uaW9fbmV0by9pcGNfMTgsDQogICAgICAgICBLVEEgPSBwcHllICsgYmllbmVzX2RlX2NhbWJpbywNCiAgICAgICAgIHNlY3RvciA9ICJNZW1vcmlhIGRlIFlQRiIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHNlY3RvciwgdW5pZGFkLCBldmVyeXRoaW5nKC4pKSANCmJhbGFuY2VfeXBmDQoNCnN0b2NrX3lwZiA8LSBiYWxhbmNlX3lwZiAlPiUgDQogIGdhdGhlcihrZXkgPSB2YXJpYWJsZSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsIA0KICAgICAgICAgNDpuY29sKC4pKSAlPiUgDQogIGZpbHRlcih2YXJpYWJsZSAlaW4lIGMoIktUQSIsICJhY3Rpdm8iLCAicHB5ZSIpKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IGNhc2Vfd2hlbihhbmlvID09IDE5ODMgfiAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA9PSAxOTg1IH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPT0gMTk4NiB+IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID09IDE5ODcgfiAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA9PSAxOTg4IH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YWxvcikpICU+JQ0KICBiaW5kX3Jvd3Moc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lIA0KICAgIHVuZ3JvdXAoKSAlPiUgDQogICAgc2VsZWN0KGFuaW8sICBzZWN0b3IgPWVtcHJlc2EsIHVuaWRhZCwgdmFyaWFibGUsIHZhbG9yICkgJT4lIA0KICAgIGZpbHRlcihzZWN0b3IgPT0gIllQRiIsDQogICAgICAgICAgIHZhcmlhYmxlICAlaW4lIGMoIktUQSIsICJhY3Rpdm8iLCAicHB5ZSIpKSkNCiAgDQoNCmBgYA0KDQojIyMgU3RvY2sgdG90YWwgZGUgbGEgcmFtYSANCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIFN0b2NrIGRlIGxhIHJhbWENCnN0b2NrX3JhbWEgPC0gc3RvY2tfYWZpcCAlPiUgDQogIGJpbmRfcm93cyhzdG9ja19iYWxhbmNlc19yYW1hKQ0KDQojIHdyaXRlLmNzdihzdG9ja19yYW1hLCBmaWxlID0iL0FyY2hpdm9zL0RhdG9zL1N0b2NrL3N0b2NrX2hpZHJvY2FyYnVyb3MuY3N2IikNCg0KDQpncmFmX3N0b2NrX3JhbWEgPC0gc3RvY2tfcmFtYSAlPiUgDQogICMgbXV0YXRlKHZhbG9yID0gbnVtYmVyX2Zvcm1hdCh2YWxvciwgYmlnLm1hcmsgPSAiICIgKSkgJT4lIA0KICBmaWx0ZXIoc2VjdG9yICE9ICJkaXN0cmlidWNpb24iKSAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSBzZWN0b3IsIHNoYXBlID0gZnVlbnRlKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KHNpemUgPSAuOCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJTdG9jayBkZSBjYXBpdGFsIGFkZWxhbnRhZG8geSBhY3Rpdm8gZGUgc2VnbWVudG9zIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJTdWJzZWN0b3JlcyBkZWwgc2VjdG9yIGhpZHJvY2FyYnVyw61mZXJvIiwNCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICBmYWNldF93cmFwKH4gdmFyaWFibGUgKQ0KDQpnZ3Bsb3RseShncmFmX3N0b2NrX3JhbWEsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA0MDApDQpgYGANCg0KDQojIyMgU3RvY2sgZGUgc2VnbWVudG9zIGRlIFlQRiB5IFBldHJvYnJhcw0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdyYWZfc3RvY2tfc2VnbWVudG9zIDwtIHVuaW9uX3NlZ21lbnRvcyAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gc2VjdG9yKSkrDQogIGdlb21fbGluZSgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiU3RvY2sgZGUgY2FwaXRhbCBkZSBzZWdtZW50b3MiLA0KICAgICAgIHN1YnRpdGxlID0gIllQRiB5IFBldHJvYnJhcyBBcmdlbnRpbmEiLA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIGZhY2V0X3dyYXAodmFyaWFibGUgfiBlbXByZXNhICkNCg0KZ2dwbG90bHkoZ3JhZl9zdG9ja19zZWdtZW50b3MsIHdpZHRoID0gNzAwLCBoZWlnaHQgPSA1MDApDQoNCg0KYGBgDQoNCiMjIyBTdG9jayBwb3IgZW1wcmVzYXMNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KZ3JhZl9zdG9ja19lbXAgPC0gc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lDQogIGZpbHRlcigNCiAgICAjIHZhcmlhYmxlICVpbiUgYygiS1RBIiwgImFjdGl2byIpLA0KICAgICAgICAgc2VjdG9yICE9ICJkaXN0cmlidWNpb24iKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gZW1wcmVzYSkpKyANCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJTdG9jayBkZSBjYXBpdGFsIHBvciBlbXByZXNhIiwNCiAgICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQogIGZhY2V0X3dyYXAofnZhcmlhYmxlKQ0KZ2dwbG90bHkoZ3JhZl9zdG9ja19lbXAsIHdpZHRoID0gNzAwLCBoZWlnaHQgPSA1MDApDQoNCg0KYGBgDQoNCiMjIyBZUEYgbGFyZ28gcGxhem8NCkNvbXBhcmFjacOzbiBlbnRyZSBsYSBNZW1vcmlhIFlQRiAocmVjb3BpbGFkbyBwb3IgQkZSKSB5IGxvcyBiYWxhbmNlcyBleHRyw61hZG9zIGRlIEJvbHNhcg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KZ3JhZl9zdG9ja195cGYgPC0gIHN0b2NrX3lwZiAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gc2VjdG9yKSkrIA0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBsYWJzKHRpdGxlID0gIlN0b2NrIGRlIGNhcGl0YWwgZGUgWVBGIiwNCiAgICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQogIGZhY2V0X3dyYXAofnZhcmlhYmxlKQ0KZ2dwbG90bHkoZ3JhZl9zdG9ja195cGYsIHdpZHRoID0gNzAwLCBoZWlnaHQgPSA1MDApDQoNCmBgYA0KDQojIyMgRXN0aW1hY2nDs24gZGUgc3RvY2sgZGUgY2FwaXRhbCBhIHBhcnRpciBkZSBsYSBldm9sdWNpw7NuIGRlIHBvem9zIHBlcmZvcmFkb3MNCg0KDQpFbCBlamVyY2ljaW8gY29uc2lzdGUgZW4gdmVyaWZpY2FyIHNpIGxvcyBwb3pvcyB0ZXJtaW5hZG9zIHNpcnZlbiBjb21vIGluZGljYWRvciBkZSBsYSBpbnZlcnNpw7NuIHksIHBvciBsbyB0YW50bywgZGUgYXByb3hpbWFkb3IgYWwgc3RvY2sgZGUgY2FwaXRhbCBhZGVsYW50YWRvLiBQYXJhIGVsbG8gc2UgcGFydGUgZGUgdW4gYcOxbyBiYXNlIGRlIGxhIHNlcmllIGRlIFByb3BpZWRhZCwgUGxhbnRhIHkgRXF1aXBvIGRlbCBzZWN0b3IgZXh0cmFjY2nDs24gZGUgQm9sc2FyIHkgQUZJUCwgcGFyYSBsdWVnbyBpbmRleGFyIGxhcyB2YXJpYWJsZXMgcG9yIGxhIGV2b2x1Y2nDs24gZGUgbG9zIHBvem9zLiBMb3MgYmFsYW5jZXMgZGUgQm9sc2FyIHF1ZSBjb3JyZXNwb25kZW4gw7puaWNhbWVudGUgYSBleHRyYWNjacOzbiBzb24gZG9zOiBQQUUgeSBUZWNwZXRyb2wsIHBvciBsbyBxdWUgZWwgdmFsb3Igb2J0ZW5pZG8gcHVlZGUgZXN0YXIgc3VicmVwcmVzZW50YWRvIHBhcmEgZGFyIGN1ZW50YSBkZWwgdG90YWwgZGUgbGEgcmFtYS4gQ29uIHJlc3BlY3RvIGFsIMOtbmRpY2UgZGUgcG96b3MsIHNlIHRvbWFyb24gZG9zIHNlcmllcyBhbHRlcm5hdGl2YXM6IHVuYSBjb25zdHJ1w61kYSBhIHBhcnRpciBkZWwgc3RvY2sgZGUgcG96b3MgZW4gZXh0cmFjY2nDs24gZWZlY3RpdmEgKGZ1ZW50ZTogSUFQRykgeSBvdHJhIGVsYWJvcmFkYSBjb24gbG9zIHBvem9zIHRlcm1pbmFkb3MgYW51YWxlcyBjYXJnYWRvcyBwb3IgZW1wcmVzYSBvcGVyYWRvcmEgKGZ1ZW50ZTogU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEpLiAgDQoNCkVsIGHDsW8gYmFzZSBlbGVnaWRvIGVzIDIwMDYsIGRhZG8gcXVlIGVzIGVsIMO6bHRpbW8gZGF0byBxdWUgcG9zZWVtb3MgZGVsIHN0b2NrIGRlIHBvem9zIHRvdGFsZXMgZW4gYWN0aXZpZGFkIGRlIElBUEcuDQoNClNlIHJlYWxpesOzIGxhIG1pc21hIGVzdGltYWNpw7NuIHBhcmEgWVBGLCBmaWx0cmFuZG8gbGFzIHZhcmlhYmxlcyBkZSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwbyAocGFyYSBlbCB0b3RhbCBkZSBsYSBlbXByZXNhLCBwb3IgbG8gcXVlIGluY2x1eWUgbm8gc8OzbG8gZXh0cmFjY2nDs24gc2lubyByZWZpbmFjacOzbiB5IG90cm9zIHJ1YnJvcykgeSBhY3Rpdm8gdG90YWwgZGVsIHVwc3RyZWFtLiBTZSB1dGlsaXrDsyDDum5pY2FtZW50ZSBlbCBpbmRpY2UgZGUgcG96b3MgdGVybWluYWRvcyBhbnVhbGVzIGRlIFlQRiBwYXJhIGVzdGltYXIgbGEgUFB5RSB5IGVsICBhY3Rpdm8sIGRhZG8gcXVlIG5vIHNlIHBvc2VlIHZhbG9yZXMgZGVsIHN0b2NrIGRlIHBvem9zIGVuIHBlcmZvcmFjacOzbiBwYXJhIGxvcyBhw7FvcyBlbiBkb25kZSBleGlzdGVuIHZhbG9yZXMgY29udGFibGVzIHF1ZSBzaXJ2YW4gZGUgYcOxbyBiYXNlLiBMdWVnbywgc2UgZXN0aW3DsyB1biBzdG9jayBkZSBjYXBpdGFsIHRvdGFsIGRlIHJhbWEgYSBwYXJ0aXIgZGUgcG9uZGVyYXIgZWwgc3RvY2sgZGUgWVBGIHBvciBsYSByZWxhY2nDs24gZW50cmUgbG9zIHBvem9zIGRlIFlQRiB5IGxvcyBwb3pvcyB0b3RhbGVzIGRlIGxhIHJhbWEuDQoNCg0KRW4gc8OtbnRlc2lzLCBlbCBsaXN0YWRvIGRlIHZhcmlhYmxlcyBlc3RpbWFkYXMtIGEgcGFydGlyIGRlIGxhcyBkb3Mgc2VyaWVzIGRlIHBvem9zIChzdG9jayB5IGZsdWpvKSxzYWx2byBwYXJhIGxhIGVzdGltYWNpw7NuIGRlIFlQRiBxdWUgc29sbyBzZSBwdWRvIGhhY2VyIGNvbiBmbHVqbyBkZSBwb3pvcyBwb3IgYXVzZW5jaWEgZGUgaW5mb3JtYWNpw7NuLSBlcyBsYXMgc2lndWllbnRlczoNCg0KKiAkcHB5ZVxfZXN0aW1hZG9cX2JvbHNhciQgPSAkUFB5RVwgYcOxb1wgYmFzZVwgZGVcIEJvbHNhciQgKiAkaW5kaWNlXCBkZVwgcG96b3MkDQoqICRwcHllXF9lc3RpbWFkb1xfYWZpcCQgPSAkUFB5RVwgYcOxb1wgYmFzZVwgZGVcIEFGSVAkICogJGluZGljZVwgZGVcIHBvem9zJA0KDQoqICRwcHllXF9lc3RpbWFkb1xfeXBmJCA9ICRQUHlFXCBhw7FvXCBiYXNlXCBkZVwgWVBGJCAqICRpbmRpY2VcIGRlXCBwb3pvc1wgWVBGJA0KKiAkYWN0aXZvXF9lc3RpbWFkb1xfdXBzdHJlYW1cX3lwZiQgPSAkQWN0aXZvXCBhw7FvXCBiYXNlXCBkZVwgWVBGJCAqICRpbmRpY2VcIGRlXCBwb3pvc1wgWVBGJA0KDQoqICRwcHllXF9lc3RpbWFkb1xfdG90YWwkID0gJHBweWVcX2VzdGltYWRvXF95cGYkICogJCRcZnJhY3twb3pvc1wgdG90YWxlc317cG96b3NcIGRlXCBZUEZ9JCQNCg0KKiAkYWN0aXZvXF9lc3RpbWFkb1xfdXBzdHJlYW0kID0gJGFjdGl2b1xfZXN0aW1hZG9cX3Vwc3RyZWFtXF95cGYkICAqICQkXGZyYWN7cG96b3NcIHRvdGFsZXN9e3Bvem9zXCBkZVwgWVBGfSQkDQoNClBhcmEgcG9kZXIgc2VsZWNjaW9uYXIgbGEgZXN0aW1hY2nDs24gbcOhcyBhZGVjdWFkYSwgc2UgcmVhbGl6w7MgdW4gYW7DoWxpc2lzIGRlIGNvcnJlbGFjacOzbiBlbnRyZSB0b2RhcyBsYXMgc2VyaWVzIGVzdGltYWRhcyB5IGxvcyB2YWxvcmVzIGNvbnRhYmxlcyBxdWUgc2UgcG9zZWVuIGRlIFBQeUUgZGUgQUZJUCwgQm9sc2FyIGUgWVBGLiBTZSBwcmVzZW50YW4gZGlzdGludG9zIGN1YWRyb3MgZGUgY29ycmVsYWNpb25lcywgY29uIHN1cyBuaXZsZXMgZGUgc2lnbmlmaWNhbmNpYSwgZGlhZ3JhbWFzIGRlIGRpc3BlcnNpw7NuIGVudHJlIHZhcmlhYmxlcyB5IHN1IGRpc3RyaWJ1Y2nDs24uIExhcyBzZXJpZXMgY29uc3RydcOtZGFzIHF1ZSBwb3NlZW4gbWVqb3IgY29ycmVsYWNpw7NuIHNvbiBsYSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwbyBhIHBhcnRpciBkZSBCb2xzYXIgZXN0aW1hZGFzIGNvbiDDrW5kaWNlIGRlIHN0b2NrIGRlIHBvem9zIChjb3JyZWxhY2nDs24gZnVlcnRlIGRlIDAuODkgeSBzaWduaWZpY2F0aXZhIGFsIDAuMDAxKSB5IGZsdWpvIGRlIHBvem9zIChjb3JyZWxhY2nDs24gbW9kZXJhZGEgZGUgMC41NCB5IHNpZ25pZmljYXRpdmEgYWwgMC4wNSkgeSBsdWVnbyBlbCBhY3Rpdm8gZGVsIHVwc3RyZWFtIHRvdGFsIGRlIGxhIHJhbWEgYSBwYXJ0aXIgZGUgWVBGIChjb3JyZWxhY2nDs24gbW9kZXJhZGEgZGUgMC40MiB5IHNpZ25pZmljYXRpdmEgYWwgMC4xIGNvbiBsb3MgdmFsb3JlcyBjb250YWJsZXMgZGUgWVBGIHkgY29ycmVsYWNpw7NuIGZ1ZXJ0ZSBkZSAwLjg4IHkgc2lnbmlmaWNhdGl2YSBhbCAwLjAwMSBjb24gbGFzIGVzdGltYWNpb25lcyBkZSBQUHlFIGRlIEFGSVAgeSBCb2xzYXIgYSBwYXJ0aXIgZGUgZmx1am8gZGUgcG96b3MpLg0KDQpsYSBlc3RpbWFjacOzbiB0aWVuZSBxdWUgcmVhbGl6YXJzZSBjb24gUFB5RSBwb3JxdWUgaGF5IHF1ZSBleGNsdWlyIHNhbGFyaW9zIGUgaW52ZW50YXJpb3MgKHF1ZSBlc3TDoW4gZW4gS1RBKQ0KDQojIyMjIEFuw6FsaXNpcyBkZSBjb3JyZWxhY2lvbiBlbnRyZSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwbyB5IFBvem9zIGVuIHByb2R1Y2Npw7NuDQoNCg0KcmVlbXBsYXphciBpcGMgcG9yIHVuIGliaWYgbyBpbmRpY2UgZXNwZWNpZmljbw0KDQojIyMjIyBUb3RhbCByYW1hDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpzdG9ja195X3Bvem9zX3Rhc2FzIDwtIHN0b2NrX3JhbWEgJT4lIA0KICBmaWx0ZXIodmFyaWFibGUgPT0gInBweWUiICYgc2VjdG9yICVpbiUgYygiZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMiLCAicHJvZHVjY2lvbiIpKSAlPiUNCiAgc2VsZWN0KGFuaW8sIHZhbG9yLGZ1ZW50ZSkgJT4lDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBzcHJlYWQoa2V5ID0gZnVlbnRlLCB2YWx1ZSA9IHZhbG9yKSAlPiUgDQogIG11dGF0ZShBRklQID0gdmFyaWFjaW9uX2ludGVyYW51YWwoQUZJUCksDQogICAgICAgICBCb2xzYXIgPSB2YXJpYWNpb25faW50ZXJhbnVhbChCb2xzYXIpKSAlPiUgDQogIGZ1bGxfam9pbihjb21wYXJhY2lvbl9wb3pvcyANCiAgICAgICAgICAgICU+JQ0KICAgICAgICAgICAgIyBzZWxlY3QoLSBwb3pvc19wZXJmb3JhZG9zX2lhcGcpDQogICAgICAgICAgICBzZWxlY3QoLSBwb3pvc192YXJpYWNpb25faWFwZykNCiAgICAgICAgICAgICwgYnkgPSAiYW5pbyIpICU+JQ0KICByZW5hbWUocHB5ZV9hZmlwID0gQUZJUCwNCiAgICAgICAgIHBweWVfYm9sc2FyID0gQm9sc2FyLA0KICAgICAgICAgcG96b3NfaWFwZyA9IHBvem9zX3BlcmZvcmFkb3NfaWFwZywNCiAgICAgICAgICMgcG96b3NfaWFwZ19jZW50ZW5hcmlvID0gcG96b3NfdmFyaWFjaW9uX2lhcGcsDQogICAgICAgICBwb3pvc190ZXJtaW5hZG9zID0gcG96b3NfdGVybWluYWRvc19zZWNfZW5lcmdpYSwNCiAgICAgICAgIHBvem9zX2NhcmdhZG9zID0gcG96b3NfY2FyZ2Fkb3Nfc2VjX2VuZXJnaWEgKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lDQogIGZpbHRlcihhbmlvID4gMTk5OCkgJT4lDQogIHNlbGVjdCgtYW5pbykgJT4lDQogIG11dGF0ZV9hbGwodGFzYV9jcmVjaW1pZW50bykgIA0KICANCg0KDQpHR2FsbHk6OmdncGFpcnMoc3RvY2tfeV9wb3pvc190YXNhcywgbG93ZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSAic21vb3RoIikpDQpwbG90KHN0b2NrX3lfcG96b3NfdGFzYXMpDQoNCiMgcm91bmQodmFyKHN0b2NrX3lfcG96b3NfdGFzYXMsIG5hLnJtID0gVFJVRSksIDQpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojbWF0cml6IGRlIGNvcnJlbGFjaW9uDQpjb3JfcG96b3MgPC0gY29yKHN0b2NrX3lfcG96b3NfdGFzYXMsIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQ0KY29yX3Bvem9zDQoNCiMgIGRpc3RpbnRvcyBjb3JyZWxvZ3JhbWFzDQojY29uIGdnY29ycnBsb3QNCmxpYnJhcnkoZ2djb3JycGxvdCkNCnAubWF0ID0gY29yX3BtYXQoc3RvY2tfeV9wb3pvc190YXNhcykNCmdnY29ycnBsb3QoY29yX3Bvem9zLCBoYy5vcmRlciA9IFRSVUUsDQogICAgdHlwZSA9ICJsb3dlciIsIHAubWF0ID0gcC5tYXQsIGxhYiA9IFQpDQoNCiMgIyAjY29uIGNvcnJwbG90DQojIGNvbCA8LSBjb2xvclJhbXBQYWxldHRlKGMoIiNCQjQ0NDQiLCAiI0VFOTk4OCIsICIjRkZGRkZGIiwgIiM3N0FBREQiLCAiIzQ0NzdBQSIpKQ0KIyBjb3JycGxvdDo6Y29ycnBsb3QoY29yX3Bvem9zLCBtZXRob2Q9ImNvbG9yIiwgY29sPWNvbCgyMDApLA0KIyAgICAgICAgICB0eXBlPSJ1cHBlciIsIG9yZGVyPSJoY2x1c3QiLA0KIyAgICAgICAgICBhZGRDb2VmLmNvbCA9ICJibGFjayIsICMgQWRkIGNvZWZmaWNpZW50IG9mIGNvcnJlbGF0aW9uDQojICAgICAgICAgIHRsLmNvbD0iYmxhY2siLCB0bC5zcnQ9NDUsICNUZXh0IGxhYmVsIGNvbG9yIGFuZCByb3RhdGlvbg0KIyAgICAgICAgICAjIENvbWJpbmUgd2l0aCBzaWduaWZpY2FuY2UNCiMgICAgICAgICAgIyBwLm1hdCA9IHAubWF0LA0KIyAgICAgICAgICAjIGluc2lnID0gImJsYW5rIiwNCiMgICAgICAgICAgc2lnLmxldmVsID0gMC4wMSkNCg0KIyAjICNjb24gZ2dnYWxseQ0KIyBHR2FsbHk6OmdnY29ycihzdG9ja195X3Bvem9zX3Rhc2FzLCBtZXRob2QgPSBjKCJjb21wbGV0ZS5vYnMiLCAicGVhcnNvbiIpICwNCiMgICAgICAgICAgICAgICAgbGFiZWwgPSBULCBsYWJlbF9yb3VuZCA9IDIpDQpgYGANCg0KYGBge3J9DQojYcOxb3MgYmFzZSAyMDA2DQpwcHllX2FuaW9fYmFzZV9ib2xzYXIgPC0gKHN0b2NrX3JhbWEgJT4lIA0KICBmaWx0ZXIodmFyaWFibGUgPT0gInBweWUiICYgc2VjdG9yID09ICJwcm9kdWNjaW9uIikgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHBweWUgPSB2YWxvcikpDQpwcHllX2FuaW9fYmFzZV9ib2xzYXIgPC0gcHB5ZV9hbmlvX2Jhc2VfYm9sc2FyJHBweWVbcHB5ZV9hbmlvX2Jhc2VfYm9sc2FyJGFuaW8gPT0yMDA2XQ0KDQojIHZhbG9yX2Jhc2UgPC0gc2VyaWVbd2hpY2goZmVjaGE9PWZlY2hhX2Jhc2UpXQ0KDQpwcHllX2FuaW9fYmFzZV9hZmlwIDwtIChzdG9ja19yYW1hICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllIiAmIHNlY3RvciA9PSAiZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMiKSAlPiUNCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHB5ZSA9IHZhbG9yKSkNCnBweWVfYW5pb19iYXNlX2FmaXAgPC0gcHB5ZV9hbmlvX2Jhc2VfYWZpcCRwcHllW3BweWVfYW5pb19iYXNlX2FmaXAkYW5pbyA9PSAyMDA2XQ0KDQoNCnN0b2NrX3lfcG96b3MgPC0gIGNvbXBhcmFjaW9uX3Bvem9zICU+JSANCiAgZ2F0aGVyKGtleSA9IGZ1ZW50ZV9wb3pvLA0KICAgICAgICAgdmFsdWUgPSBjYW50aWRhZF9wb3pvcywNCiAgICAgICAgIDI6bmNvbCguKSkgJT4lDQogIGFycmFuZ2UoZnVlbnRlX3Bvem8sYW5pbykgJT4lIA0KICBncm91cF9ieShmdWVudGVfcG96bykgJT4lIA0KICBtdXRhdGUoaW5kaWNlX3Bvem9zXzA2ID0gZ2VuZXJhcl9pbmRpY2Uoc2VyaWU9IGNhbnRpZGFkX3Bvem9zICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYSA9IGFuaW8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9IDIwMDYpKSAlPiUgDQogICMgbGVmdF9qb2luKHN0b2NrX3JhbWEgJT4lICANCiAgIyAgICAgICAgICAgICBmaWx0ZXIodmFyaWFibGUgPT0gInBweWUiICYgc2VjdG9yICVpbiUgYygiZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMiLCAicHJvZHVjY2lvbiIpKSAlPiUNCiAgIyAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcHB5ZSA9IHZhbG9yLCBmdWVudGVfc3RvY2sgPSBmdWVudGUpLCBieSA9ICJhbmlvIikgJT4lIA0KICBtdXRhdGUocHB5ZV9hZmlwID0gcHB5ZV9hbmlvX2Jhc2VfYWZpcCAqIGluZGljZV9wb3pvc18wNiwNCiAgICAgICAgIHBweWVfYm9sc2FyID1wcHllX2FuaW9fYmFzZV9ib2xzYXIgKiBpbmRpY2VfcG96b3NfMDYsDQogICAgICAgICB1bmlkYWRfcHB5ZT0iTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpICU+JSANCiAgZ2F0aGVyKGtleSA9IGZ1ZW50ZV9wcHllLA0KICAgICAgICAgdmFsdWUgPSBwcHllX2VzdGltYWRvLA0KICAgICAgICAgNTo2KQ0Kc3RvY2tfeV9wb3pvcw0KDQpnZ3Bsb3RseShzdG9ja195X3Bvem9zICU+JSANCiAgZmlsdGVyKGFuaW8gPjE5NjApICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLHBweWVfZXN0aW1hZG8gLCBjb2xvciA9IGZ1ZW50ZV9wb3pvKSkrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHk9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQogIGZhY2V0X3dyYXAofmZ1ZW50ZV9wcHllICAgICksDQogICAgd2lkdGggPSA4MDAsIGxlbmd0aCA9NTAwKQ0KDQpzdG9ja19lc3RpbWFkbyA8LSBzdG9ja195X3Bvem9zICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZmlsdGVyKGZ1ZW50ZV9wb3pvID09InBvem9zX2NhcmdhZG9zX3NlY19lbmVyZ2lhIiwgZnVlbnRlX3BweWUgPT0icHB5ZV9ib2xzYXIiKSAlPiUgDQogIHJlbmFtZSh1bmlkYWQgPSB1bmlkYWRfcHB5ZSwgdmFsb3IgPXBweWVfZXN0aW1hZG8pICU+JSANCiAgc2VsZWN0KC1jKGNhbnRpZGFkX3Bvem9zLCBpbmRpY2VfcG96b3NfMDYsIGZ1ZW50ZV9wb3pvKSkNCg0KYGBgDQoNCg0KIyMjIyMjIFN0b2NrIGRlIHBvem9zDQpgYGB7cn0NCnN0b2NrX3lfcG96b3NfdGFzYXNfdjIgPC0gc3RvY2tfcmFtYSAlPiUgDQogIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZSIgJiBzZWN0b3IgJWluJSBjKCJleHRyYWNjaW9uX3BldHJvbGVvX2dhcyIsICJwcm9kdWNjaW9uIikpICU+JQ0KICBzZWxlY3QoYW5pbywgdmFsb3IsZnVlbnRlKSAlPiUNCiAgc3ByZWFkKGtleSA9IGZ1ZW50ZSwgdmFsdWUgPSB2YWxvcikgJT4lIA0KICBmdWxsX2pvaW4ocG96b3NfaWFwZ19jZW50ZW5hcmlvJT4lDQogICAgICAgICAgICBzZWxlY3QoYW5pbywgcG96b3NfaWFwZyA9IHRvdGFsZXMgKSwgYnkgPSAiYW5pbyIpICU+JQ0KICByZW5hbWUocHB5ZV9hZmlwID0gQUZJUCwNCiAgICAgICAgIHBweWVfYm9sc2FyID0gQm9sc2FyICkgJT4lIA0KICBhcnJhbmdlKGFuaW8pICU+JQ0KICBmaWx0ZXIoYW5pbyA+IDE5OTgpICU+JQ0KICBzZWxlY3QoLWFuaW8pICU+JQ0KICBtdXRhdGVfYWxsKHRhc2FfY3JlY2ltaWVudG8pICANCiAgDQoNCg0KR0dhbGx5OjpnZ3BhaXJzKHN0b2NrX3lfcG96b3NfdGFzYXNfdjIsIGxvd2VyID0gbGlzdChjb250aW51b3VzID0gInNtb290aCIpKQ0KcGxvdChzdG9ja195X3Bvem9zX3Rhc2FzX3YyKQ0KDQojIHJvdW5kKHZhcihzdG9ja195X3Bvem9zX3Rhc2FzLCBuYS5ybSA9IFRSVUUpLCA0KQ0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KI21hdHJpeiBkZSBjb3JyZWxhY2lvbg0KY29yX3Bvem9zIDwtIGNvcihzdG9ja195X3Bvem9zX3Rhc2FzX3YyLCB1c2UgPSAiY29tcGxldGUub2JzIikNCmNvcl9wb3pvcw0KDQojICBkaXN0aW50b3MgY29ycmVsb2dyYW1hcw0KI2NvbiBnZ2NvcnJwbG90DQpsaWJyYXJ5KGdnY29ycnBsb3QpDQpwLm1hdCA9IGNvcl9wbWF0KHN0b2NrX3lfcG96b3NfdGFzYXMpDQpnZ2NvcnJwbG90KGNvcl9wb3pvcywgaGMub3JkZXIgPSBUUlVFLA0KICAgIHR5cGUgPSAibG93ZXIiLCBwLm1hdCA9IHAubWF0LCBsYWIgPSBUKQ0KDQojICMgI2NvbiBjb3JycGxvdA0KIyBjb2wgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCIjQkI0NDQ0IiwgIiNFRTk5ODgiLCAiI0ZGRkZGRiIsICIjNzdBQUREIiwgIiM0NDc3QUEiKSkNCiMgY29ycnBsb3Q6OmNvcnJwbG90KGNvcl9wb3pvcywgbWV0aG9kPSJjb2xvciIsIGNvbD1jb2woMjAwKSwNCiMgICAgICAgICAgdHlwZT0idXBwZXIiLCBvcmRlcj0iaGNsdXN0IiwNCiMgICAgICAgICAgYWRkQ29lZi5jb2wgPSAiYmxhY2siLCAjIEFkZCBjb2VmZmljaWVudCBvZiBjb3JyZWxhdGlvbg0KIyAgICAgICAgICB0bC5jb2w9ImJsYWNrIiwgdGwuc3J0PTQ1LCAjVGV4dCBsYWJlbCBjb2xvciBhbmQgcm90YXRpb24NCiMgICAgICAgICAgIyBDb21iaW5lIHdpdGggc2lnbmlmaWNhbmNlDQojICAgICAgICAgICMgcC5tYXQgPSBwLm1hdCwNCiMgICAgICAgICAgIyBpbnNpZyA9ICJibGFuayIsDQojICAgICAgICAgIHNpZy5sZXZlbCA9IDAuMDEpDQoNCiMgIyAjY29uIGdnZ2FsbHkNCiMgR0dhbGx5OjpnZ2NvcnIoc3RvY2tfeV9wb3pvc190YXNhcywgbWV0aG9kID0gYygiY29tcGxldGUub2JzIiwgInBlYXJzb24iKSAsDQojICAgICAgICAgICAgICAgIGxhYmVsID0gVCwgbGFiZWxfcm91bmQgPSAyKQ0KYGBgDQoNCg0KIyMjIyMgWVBGDQpgYGB7cn0NCnBweWVfeXBmIDwtIHlwZl9zZWcgJT4lIA0KICBmaWx0ZXIoc2VjdG9yICA9PSAidXBzdHJlYW0iICkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IHllYXIoZmVjaGEpKSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgaXBjXzE4KSwgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHZhcmlhYmxlID0gImFjdGl2b191cHN0cmVhbV95cGYiLA0KICAgICAgICAgYWN0aXZvcyA9IGFjdGl2b3MvaXBjXzE4LA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiKSU+JSANCiAgc2VsZWN0KGFuaW8sIGVtcHJlc2EsIHVuaWRhZCAsICBhY3Rpdm9fdXBzdHJlYW09IGFjdGl2b3MpICU+JSANCiAgbGVmdF9qb2luKHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzICU+JSANCiAgICB1bmdyb3VwKCkgJT4lIA0KICAgIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZSIgJiBlbXByZXNhID09ICJZUEYiKSAlPiUNCiAgICBzZWxlY3QoYW5pbywgZW1wcmVzYSwgdW5pZGFkLCBwcHllX2ludGVncmFkYSA9dmFsb3IpICwgYnkgPSBjKCJhbmlvIiwgImVtcHJlc2EiLCAidW5pZGFkIikpICU+JSANCiAgbXV0YXRlKGFjdGl2b191cHN0cmVhbSA9IHZhcmlhY2lvbl9pbnRlcmFudWFsKGFjdGl2b191cHN0cmVhbSksDQogICAgICAgICBwcHllX2ludGVncmFkYSA9IHZhcmlhY2lvbl9pbnRlcmFudWFsKHBweWVfaW50ZWdyYWRhKSkgJT4lIA0KICBmdWxsX2pvaW4obGlzdGFkb19wb3pvcyAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KC1lbXByZXNhKSAlPiUgDQogICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihpZGVtcHJlc2EgPT0gIllQRiIpICU+JSANCiAgICAgICAgICAgICAgcmVuYW1lKGFuaW8gPSBhbmlvX3Rlcm1pbmFjaW9uX3Bvem8sIGVtcHJlc2EgPSBpZGVtcHJlc2EpLCBieSA9IGMoImFuaW8iLCAiZW1wcmVzYSIpICkgJT4lIA0KICBhcnJhbmdlKGFuaW8pDQpwcHllX3lwZg0KDQpwcHllX3lwZl90YXNhcyA8LSBwcHllX3lwZiAlPiUNCiAgIGFycmFuZ2UoYW5pbykgJT4lDQogIGZpbHRlcihhbmlvICVpbiUgMTk5ODoyMDE4KSAlPiUNCiAgc2VsZWN0KC1jKGFuaW8sIGVtcHJlc2EsIHVuaWRhZCkpICU+JQ0KICBtdXRhdGVfYWxsKHRhc2FfY3JlY2ltaWVudG8pDQoNCiNtYXRyaXogZGUgY29ycmVsYWNpb24NCmNvcl9wb3pvc195cGYgPC0gY29yKHBweWVfeXBmX3Rhc2FzLCB1c2UgPSAiY29tcGxldGUub2JzIikNCmNvcl9wb3pvc195cGYNCg0KIyAgZGlzdGludG9zIGNvcnJlbG9ncmFtYXMNCiNjb24gZ2djb3JycGxvdA0KcC5tYXQgPSBjb3JfcG1hdChjb3JfcG96b3NfeXBmKQ0KZ2djb3JycGxvdChjb3JfcG96b3NfeXBmLCBoYy5vcmRlciA9IFRSVUUsDQogICAgdHlwZSA9ICJsb3dlciIsIHAubWF0ID0gcC5tYXQsIGxhYiA9IFQpDQoNCkdHYWxseTo6Z2dwYWlycyhwcHllX3lwZl90YXNhcywgbG93ZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSAic21vb3RoIikpDQpwbG90KHBweWVfeXBmX3Rhc2FzKQ0KYGBgDQoNCg0KYGBge3J9DQojYcOxb3MgYmFzZXMNCmFuaW9fYmFzZV95cGZfc2VnbWVudG8gPC0gICBwcHllX3lwZiRhY3Rpdm9fdXBzdHJlYW1bcHB5ZV95cGYkYW5pbyA9PSAyMDA2XQ0KDQphbmlvX2Jhc2VfeXBmX2JvbHNhciA8LSBwcHllX3lwZiRwcHllX2ludGVncmFkYVtwcHllX3lwZiRhbmlvID09IDIwMDZdDQoNCg0Kc3RvY2tfeV9wb3pvc195cGYgPC0gIHBweWVfeXBmICU+JSANCiAgbXV0YXRlKGluZGljZV9wb3pvc18wNiA9IGdlbmVyYXJfaW5kaWNlKHNlcmllPSBwb3pvcyAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGEgPSBhbmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX2Jhc2UgPSAyMDA2KSkgJT4lIA0KICBtdXRhdGUocHB5ZV95cGZfZXN0aW1hZG8gPSBhbmlvX2Jhc2VfeXBmX2JvbHNhciAqIGluZGljZV9wb3pvc18wNiwNCiAgICAgICAgIGFjdGl2b195cGZfZXN0aW1hZG8gPWFuaW9fYmFzZV95cGZfc2VnbWVudG8gKiBpbmRpY2VfcG96b3NfMDYsDQogICAgICAgICB1bmlkYWRfcHB5ZT0iTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpDQoNCnN0b2NrX3lfcG96b3NfeXBmICU+JQ0KICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3BweWUsIHBweWVfeXBmX2VzdGltYWRvLCBhY3Rpdm9feXBmX2VzdGltYWRvKSAlPiUNCiAgICAgICAgICAgZ2F0aGVyKGtleSA9IGVzdGltYWNpb24sDQogICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWxvciwgDQogICAgICAgICAgICAgICAgICAgMzo0KSAlPiUgDQogICAgICAgICAgIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbyx2YWxvciAsIGNvbG9yID0gZXN0aW1hY2lvbikpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh5PSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIsIHRpdGxlID0gIkVzdGltYWNpb24gZGUgQWN0aXZvIHVzcHRyZWFtIHkgUFB5RSBkZSBZUEYgYSBwYXJ0aXIgZGUgaW5kaWNlIGRlIHBvem9zIikNCmBgYA0KDQojIyMjIyMgUFB5RSB5IGFjdGl2byB1cHN0cmVhbSB0b3RhbCByYW1hIGEgcGFydGlyIGRlIFlQRg0KDQpgYGB7cn0NCnBvem9zX3lmcF9zb2JyZV90b3RhbCA8LSBsaXN0YWRvX3Bvem9zICU+JQ0KICByZW5hbWUoYW5pbyA9IGFuaW9fdGVybWluYWNpb25fcG96bykgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShwb3pvc19jYXJnYWRvc19zZWNfZW5lcmdpYSA9IHN1bShwb3pvcywgbmEucm0gPSBUKSkgJT4lIA0KICBsZWZ0X2pvaW4obGlzdGFkb19wb3pvcyAlPiUNCiAgICAgICAgICAgICAgcmVuYW1lKGFuaW8gPSBhbmlvX3Rlcm1pbmFjaW9uX3Bvem8pICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKGlkZW1wcmVzYSA9PSAiWVBGIikgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhbmlvLCBpZGVtcHJlc2EpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvem9zX2NhcmdhZG9zX3lwZiA9IHN1bShwb3pvcywgbmEucm0gPSBUKSkpICU+JSANCiAgbXV0YXRlKHlwZl9zb2JyZV90b3RhbCA9IHBvem9zX2NhcmdhZG9zX3lwZi9wb3pvc19jYXJnYWRvc19zZWNfZW5lcmdpYSkNCiMgcG96b3NfeWZwX3NvYnJlX3RvdGFsDQoNCmVzdGltYWNpb25fcHB5ZV90b3RhbF92aWFfeXBmIDwtIHN0b2NrX3lfcG96b3NfeXBmICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9wcHllLCBwcHllX3lwZl9lc3RpbWFkbywgYWN0aXZvX3lwZl9lc3RpbWFkbykgJT4lIA0KICBnYXRoZXIoa2V5ID0gZXN0aW1hY2lvbiwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsIA0KICAgICAgICAgMzo0KSAlPiUgDQogIGxlZnRfam9pbihwb3pvc195ZnBfc29icmVfdG90YWwgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgeXBmX3NvYnJlX3RvdGFsKSkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSB2YWxvci95cGZfc29icmVfdG90YWwsDQogICAgICAgICAgZXN0aW1hY2lvbiA9IGNhc2Vfd2hlbihlc3RpbWFjaW9uID09ICJwcHllX3lwZl9lc3RpbWFkbyIgfiAicHB5ZV9lc3RpbWFkb190b3RhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWFjaW9uID09ICJhY3Rpdm9feXBmX2VzdGltYWRvIiB+ICJhY3Rpdm9fZXN0aW1hZG9fdXBzdHJlYW0iICkpDQogIA0KZXN0aW1hY2lvbl9wcHllX3RvdGFsX3ZpYV95cGYgJT4lDQogICAgICAgICAgIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbyx2YWxvciAsIGNvbG9yID0gZXN0aW1hY2lvbikpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh5PSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIsIA0KICAgICAgIHRpdGxlID0gIkVzdGltYWNpb24gZGUgQWN0aXZvIHVzcHRyZWFtIHkgUFB5RSB0b3RhbCBhIHBhcnRpciBkZSBhbXBsaWFjacOzbiBkZSBwb3pvcyBZUEYiKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQojIyBJbnZlcnNpb25lcw0KDQpGdWVudGVzOiANCg0KKiBCYWxhbmNlcyBkZSBCb2xzYXIuIEludmVyc2nDs24gY2FsY3VsYWRhIGEgcGFydGlyIGRlIHZhcmlhY2lvbmVzIGRlbCBhY3Rpdm8gKyBjb25zdW1vIGRlIGNhcGl0YWwgZmlqbyAoZXN0byDDumx0aW1vIGVzdMOhIHBlbmRpZW50ZSkNCiogU2VjcmV0YXJpYSBkZSBFbmVyZ8OtYS4gUmVzb2x1Y2nDs24gMjA1NyANCiAgKyBbSW52ZXJzaW9uZXMgcmVhbGl6YWRhcyBhw7FvIGFudGVyaW9yXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvaW52ZXJzaW9uZXMtZW4tbWVyY2Fkby1kZS1oaWRyb2NhcmJ1cm9zLXVwc3RyZWFtL2FyY2hpdm8vMjg1ZDQ1ZTUtMWI4OC00ZGFlLThlNWMtYzAxODQzYzdjOGMwKQ0KICArIFtJbnZlcnNpb25lcyBhbnVhbGVzIHByZXZpc3RhcyBhIHJlYWxpemFyIGVuIGVsIGHDsW8gZGUgbGEgcHJlc2VudGFjacOzbiBkZSBsYSBEREpKXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvaW52ZXJzaW9uZXMtZW4tbWVyY2Fkby1kZS1oaWRyb2NhcmJ1cm9zLXVwc3RyZWFtKQ0KDQoNCjQpIGNvbnN0cnVpciBzZXJpZSBkZSBpbnZlcnNpw7NuIHBhcmEgYXRyYXMgKGJ1c2NhciBTdG9jayBkZSBZUEYgcGVybyBzb2xvIHBhcmEgZXh0cmFjY2nDs24pLiBhcm1hciBlamVyY2ljaW8gZGUgRkQgeSB2ZXIgc2kgbGFzIHByb3BvcmNpb25lcyBzZSBtYW50aWVuZW4uIA0KDQoqIFJlY29uc3RydWNjaW9uIGRlIHNlcmllIGRlIGludmVyc2lvbiBwb3IgZW1wcmVzYQ0KdmVyIHVuIGZsdWpvIGRlIHBvem9zIHkgdW4gZmx1am8gZGUgaW52ZXJzaW9uIHkgbHVlZ28gdmVyIHNpIGxvIHF1ZSBtdWV2ZSBsYSBpbnZlcnNpb24gc29uIGxvcyBwb3pvcyAocXVlIHN1IGV2b2x1Y2lvbiBzZWEgc2ltaWxhcikuIA0KDQotIGludmVyc2lvbiBwb3IgZW1wcmVzYSAoYmFsYW5jZTogdmFyaWFjaW9uIGRlbCBhY3Rpdm8gKyBjb25zdW1vIGRlIEsgZmlqbykNCi0gaW52ZXJzaW9uIHBvciBlbXByZXNhIChzZWNyZXRhcmlhIGRlIGVuZXJnaWEpDQotIGludmVyc2lvbiBhZ3JlZ2FkYSAodGlwbyBkZSBpbnZlcnNpb24pIChjdWVudGFzIG5hY2lvbmFsZXM/KQ0KLSBwb3pvcyBudWV2b3MgcG9yIGVtcHJlc2EgcG9yIGHDsW8NCi0gcG96b3MgbnVldm9zIHRvdGFsZXMNCi0gYXBsaWNhciBNSVAgcGFyYSBZUEYgDQoNCkludmVyc2nDs24gYSBwYXJ0aXIgZGUgQmFsYW5jZXMNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmludmVyc2lvbmVzX2VtcHJlc2EgPC0gc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIHNlbGVjdCgtYyhmdWVudGUsIHNlY3RvcikpICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllIikgJT4lDQogIGFycmFuZ2UoZW1wcmVzYSwgYW5pbykgJT4lIA0KICBncm91cF9ieSh1bmlkYWQsIHZhcmlhYmxlLCBlbXByZXNhKSAlPiUNCiAgbXV0YXRlKHZhbG9yID0gdmFyaWFjaW9uX2ludGVyYW51YWwodmFsb3IpKQ0KICAgDQojIGludmVyc2lvbmVzX2VtcHJlc2ENCg0KZ3JhZl9pbnZlcnNpb25lc19lbXByZXNhIDwtIGludmVyc2lvbmVzX2VtcHJlc2EgJT4lIA0KICBmaWx0ZXIoZW1wcmVzYSAhPSAiQ2FtdXp6aSBHYXMgUGFtcGVhbmEiKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gZW1wcmVzYSkpKyANCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJJbnZlcnNpb25lcyBwb3IgZW1wcmVzYSIsDQogICAgICAgc3VidGl0bGUgPSAiQSBwYXJ0aXIgZGUgYmFsYW5jZXMiLA0KICAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiLA0KICAgICAgIGNhcHRpb24gPSAiQmFsYW5jZXMgZGUgZW1wcmVzYXMgZXh0cmHDrWRvcyBkZSBCb2xzYXIiKSsNCiAgZmFjZXRfd3JhcCh+dmFyaWFibGUpDQojIGdncGxvdGx5KGdyYWZfaW52ZXJzaW9uZXNfZW1wcmVzYSwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCg0KYGBgDQoNCg0KSW52ZXJzacOzbiBhIHBhcnRpciBkZSBTZWNyZXRhcmlhIGRlIEVuZXJnw61hDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KaW52ZXJzaW9uZXNfYW5pb19hbnRlcmlvciA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9JbnZlcnNpb24vU2VjcmV0YXJpYSBkZSBFbmVyZ2lhL3Jlc29sdWNpbi0yMDU3LWludmVyc2lvbmVzLXJlYWxpemFkYXMtYW8tYW50ZXJpb3IuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhgRmVjaGEgRmluIFRhcmVhc2AgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJWQvJW0vJVkiKSwgDQogICAgICAgIGBGZWNoYSBJbmljaW8gVGFyZWFzYCA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlZC8lbS8lWSIpKSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw7FvIGRlIHByZXNlbnRhY2nDs24gZGUgbGEgRERKSiIsDQogICAgICAgICBlbXByZXNhID0gIkVtcHJlc2EgaW5mb3JtYW50ZSIsDQogICAgICAgICBjb25jZXB0byA9ICJEZXNjcmlwY2nDs24gZGVsIHBsYW4gZGUgYWNjacOzbiAoQ29uY2VwdG9zKSIsDQogICAgICAgICBjYW50aWRhZF9leHBsb3JhY2lvbiA9ICJDYW50LiBFeHBsb3JhY2lvbiIsDQogICAgICAgICBjYW50aWRhZF9leHBsb3RhY2lvbiA9ICJDYW50LiBFeHBsb3RhY2lvbiIsDQogICAgICAgICBjYW50aWRhZF9leHBsb3JhY2lvbl9jb21wbGVtZW50YXJpYSA9ICJDYW50LiBFeHBsb3JhY2lvbiBDb21wbGVtZW50YXJpYSIsDQogICAgICAgICBleHBsb3JhY2lvbl9taWxsb25lc191c2QgPSAiTWlsbG9uZXMgdSRzIEV4cGxvcmFjaW9uIiwNCiAgICAgICAgIGV4cGxvdGFjaW9uX21pbGxvbmVzX3VzZCA9ICJNaWxsb25lcyB1JHMgRXhwbG90YWNpb24iLA0KICAgICAgICAgZXhwbG9yYWNpb25fY29tcGxfbWlsbG9uZXNfdXNkID0gIk1pbGxvbmVzIHUkcyBFeHAuIENvbXBsZW1lbnRhcmlhIikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGFuaW8gLSAxLA0KICAgICAgICAgZW1wcmVzYSA9Y2FzZV93aGVuKGVtcHJlc2EgPT0gIllQRiBTLkEuIiB+ICJZUEYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgKFNVQ1VSU0FMIEFSR0VOVElOQSkgTExDIiB+ICJQQUUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgU0wiIH4gIlBBRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUEVUUk9CUkFTIEFSR0VOVElOQSBTLkEuIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBFU0EgKFBFVFJPQlJBUyBFLlMuQS4pIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIkVOQVAgU0lQRVRST0wgQVJHRU5USU5BIFMuQS4iIH4gIkVOQVAgU0lQRVRST0wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlZJU1RBIE9JTCAmIEdBUyBBUkdFTlRJTkEgU0FVIiB+ICJWaXN0YSBPaWwgYW5kIEdhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiVklTVEEgT0lMICYgR0FTIEFSR0VOVElOQSBTQSIgfiAiVmlzdGEgT2lsIGFuZCBHYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlNJTk9QRUMgQVJHRU5USU5BIEVYUExPUkFUSU9OIEFORCBQUk9EVUNUSU9OLCBJTkMuIiB+ICJTaW5vcGVjIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJURUNQRVRST0wgUy5BLiIgfiAiVGVjcGV0cm9sIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUExVU1BFVFJPTCBTLkEuIiB+ICJQbHVzcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJQTFVTUEVUUk9MIEVORVJHWSBTLkEuIiB+ICJQbHVzcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJDT01QQcORw41BIEdFTkVSQUwgREUgQ09NQlVTVElCTEVTIFMuQS4iIH4gIkNHQyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiV0lOVEVSU0hBTEwgRU5FUkdJQSBTLkEuIiB+ICJXaW50ZXJzaGFsbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiWVNVUiBFTkVSR8ONQSBBUkdFTlRJTkEgUy5SLkwuIiB+ICJZU1VSIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJZU1VSIFBFVFJPTEVSQSBBUkdFTlRJTkEgUy5BLiIgfiAiWVNVUiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiVE9UQUwgQVVTVFJBTCBTLkEuIiB+ICJUb3RhbCBBdXN0cmFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gZW1wcmVzYSkpICU+JSANCiAgc2VsZWN0KGFuaW8sIGVtcHJlc2EsIGlkZW1wcmVzYSwgIGNvbmNlcHRvLA0KICAgICAgICAgY2FudGlkYWRfZXhwbG9yYWNpb24sIGNhbnRpZGFkX2V4cGxvdGFjaW9uLGNhbnRpZGFkX2V4cGxvcmFjaW9uX2NvbXBsZW1lbnRhcmlhLA0KICAgICAgICAgZXhwbG9yYWNpb25fbWlsbG9uZXNfdXNkLGV4cGxvdGFjaW9uX21pbGxvbmVzX3VzZCwgZXhwbG9yYWNpb25fY29tcGxfbWlsbG9uZXNfdXNkICkgJT4lIA0KICAjIGZpbHRlcihzdHJfZGV0ZWN0KGNvbmNlcHRvLCAncG96bycpKSAlPiUNCiAgZ3JvdXBfYnkoZW1wcmVzYSwgYW5pbykgJT4lIA0KICBzdW1tYXJpc2UoaW52ZXJzaW9uX2V4cGxvdGFjaW9uID0gc3VtKGV4cGxvdGFjaW9uX21pbGxvbmVzX3VzZCwgbmEucm0gPSBUKSkgJT4lIA0KICBhcnJhbmdlKC1pbnZlcnNpb25fZXhwbG90YWNpb24pICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBVU0QiKQ0KaW52ZXJzaW9uZXNfYW5pb19hbnRlcmlvcg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnJlc29sdWNpbl8yMDU3X2ludmVyc2lvbmVzX3JlYWxpemFkYXNfbWVuc3VhbCA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9JbnZlcnNpb24vU2VjcmV0YXJpYSBkZSBFbmVyZ2lhL3Jlc29sdWNpbi0yMDU3LWludmVyc2lvbmVzLXJlYWxpemFkYXMtbWVuc3VhbC5jc3YiKQ0KDQpyZXNvbHVjaW5fMjA1N19pbnZlcnNpb25lc19maW5fY29uY2VzaW9uPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvSW52ZXJzaW9uL1NlY3JldGFyaWEgZGUgRW5lcmdpYS9yZXNvbHVjaW4tMjA1Ny1pbnZlcnNpb25lcy1yZWFsaXphZGFzLWZpbi1kZS1jb25jZXNpbi5jc3YiKQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmludmVyc2lvbmVzXzIwMDVfMjAxMiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0ludmVyc2lvbi9TZWNyZXRhcmlhIGRlIEVuZXJnaWEvdGFibGFzIGRpbmFtaWNhcy9pbnZlcnNpb25lc18yMDA1XzIwMTIueGxzeCIsIA0KICAgIGNvbF90eXBlcyA9IGMoIm51bWVyaWMiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIpLCANCiAgICBza2lwID0gOCkgJT4lIA0KICByZW5hbWUocGxhbl8xcmFfc2VtYW5hID0gIlBsYW4gMcKqIFNlbS4iLA0KICAgICAgICAgcGxhbl9hbnVhbCA9ICJQbGFuIEFudWFsIiwNCiAgICAgICAgIHJlYWxpemFkb19hbnVhbCA9ICJSZWFsaXphZG8gQW51YWwiLA0KICAgICAgICAgY29uY2VwdG8gPSBDb25jZXB0bykgJT4lIA0KICBtdXRhdGUoYW5pbyA9ICB6b286Om5hLmxvY2YoYW5pbyksDQogICAgICAgICBlbXByZXNhID0gIHpvbzo6bmEubG9jZihlbXByZXNhKSwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBVU0QiLA0KICAgICAgICAgZW1wcmVzYSA9Y2FzZV93aGVuKGVtcHJlc2EgPT0gIllQRiBTLkEuIiB+ICJZUEYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgKFNVQ1VSU0FMIEFSR0VOVElOQSkgTExDIiB+ICJQQUUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgU0wiIH4gIlBBRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUEVUUk9CUkFTIEFSR0VOVElOQSBTLkEuIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBFU0EgKFBFVFJPQlJBUyBFLlMuQS4pIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIkVOQVAgU0lQRVRST0wgQVJHRU5USU5BIFMuQS4iIH4gIkVOQVAgU0lQRVRST0wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlZJU1RBIE9JTCAmIEdBUyBBUkdFTlRJTkEgU0FVIiB+ICJWaXN0YSBPaWwgYW5kIEdhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiVklTVEEgT0lMICYgR0FTIEFSR0VOVElOQSBTQSIgfiAiVmlzdGEgT2lsIGFuZCBHYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlNJTk9QRUMgQVJHRU5USU5BIEVYUExPUkFUSU9OIEFORCBQUk9EVUNUSU9OLCBJTkMuIiB+ICJTaW5vcGVjIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJURUNQRVRST0wgUy5BLiIgfiAiVGVjcGV0cm9sIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUExVU1BFVFJPTCBTLkEuIiB+ICJQbHVzcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJQTFVTUEVUUk9MIEVORVJHWSBTLkEuIiB+ICJQbHVzcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJDT01QQcORw41BIEdFTkVSQUwgREUgQ09NQlVTVElCTEVTIFMuQS4iIH4gIkNHQyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiV0lOVEVSU0hBTEwgRU5FUkdJQSBTLkEuIiB+ICJXaW50ZXJzaGFsbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiWVNVUiBFTkVSR8ONQSBBUkdFTlRJTkEgUy5SLkwuIiB+ICJZU1VSIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJZU1VSIFBFVFJPTEVSQSBBUkdFTlRJTkEgUy5BLiIgfiAiWVNVUiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiVE9UQUwgQVVTVFJBTCBTLkEuIiB+ICJUb3RhbCBBdXN0cmFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gZW1wcmVzYSkpICU+JSANCiAgZmlsdGVyKCEoZW1wcmVzYSAlaW4lIGMoIk8mRyBERVZFTE9QTUVOVFMgTFREIFMuQS4iICwiUEVUUk9NSU5FUkEgQ0hVQlVUIFMuRS4iKSkpICU+JQ0KICAjIGZpbHRlcihzdHJfZGV0ZWN0KGNvbmNlcHRvLCAncG96bycpKSAlPiUNCiAgZ3JvdXBfYnkoZW1wcmVzYSwgYW5pbywgdW5pZGFkKSAlPiUgDQogIHN1bW1hcmlzZShpbnZlcnNpb25fYW51YWwgPSBzdW0ocmVhbGl6YWRvX2FudWFsLCBuYS5ybSA9IFQpKSAlPiUgDQogIGFycmFuZ2UoLWludmVyc2lvbl9hbnVhbCkNCmludmVyc2lvbmVzXzIwMDVfMjAxMg0KDQoNCg0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmdyYWZfaW52ZXJzaW9uZXNfMjAwNV8yMDEyIDwtICBpbnZlcnNpb25lc18yMDA1XzIwMTIgJT4lDQogIGdncGxvdChhZXMoYW5pbywgaW52ZXJzaW9uX2FudWFsLCBjb2xvciA9IGVtcHJlc2EpKSsgDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAiSW52ZXJzaW9uZXMgcG9yIGVtcHJlc2EgKHRhYmxhcyBkaW5hbWljYXMpIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJFeHRyYcOtZG8gZGUgdGFibGFzIGRpbsOhbWljYXMiLA0KICAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIsDQogICAgICAgY2FwdGlvbiA9ICJTZWNyZXRhcmlhIGRlIEVuZXJnw61hIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCmdncGxvdGx5KGdyYWZfaW52ZXJzaW9uZXNfMjAwNV8yMDEyLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KDQpncmFmX2ludmVyc2lvbmVzX2FuaW9fYW50ZXJpb3IgPC0gIGludmVyc2lvbmVzX2FuaW9fYW50ZXJpb3IgJT4lDQogIGdncGxvdChhZXMoYW5pbywgaW52ZXJzaW9uX2V4cGxvdGFjaW9uLCBjb2xvciA9IGVtcHJlc2EpKSsgDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAiSW52ZXJzaW9uZXMgcG9yIGVtcHJlc2EgKGHDsW8gYW50ZXJpb3IpIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJJbnZlcnNpb25lcyBhw7FvIGFudGVyaW9yIiwNCiAgICAgICAgeSA9ICJNaWxsb25lcyBkZSBVU0QiLA0KICAgICAgIGNhcHRpb24gPSAiU2VjcmV0YXJpYSBkZSBFbmVyZ8OtYSIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpnZ3Bsb3RseShncmFmX2ludmVyc2lvbmVzX2FuaW9fYW50ZXJpb3IsIHdpZHRoID0gNzAwLCBoZWlnaHQgPSA0NTApDQoNCmBgYA0KDQoNCiMjIyBBbsOhbGlzaXMgZGUgY29ycmVsYWNpw7NuIGVudHJlIEludmVyc2nDs24geSBQb3pvcw0KDQotIGJ1c2NhciBjb3JyZWxhY2lvbiwgcGFyYSB2ZXIgc2kgbGEgc2VyaWUgZGUgaW52ZXJzacOzbiBzZSBtdWV2ZSBzaW1pbGFyIGEgbG9zIHBvem9zDQotIHVzYXIgc3RvY2sgeSBhZGVtYXMgdXNhciB2YXJpYWNpb24gZGUgc3RvY2sgKGJzIGRlIHVzbykNCg0KQ29uIHBvem9zIGRlIElBUEcNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIGNvbiBpbnZlcnNpb25lcyByZWFsaXphZGFzIGHDsW8gYW50ZXJpb3INCmludmVyc2lvbl9wb3pvcyA8LSBwb3pvc19pYXBnICU+JSANCiAgbGVmdF9qb2luKGludmVyc2lvbmVzX2FuaW9fYW50ZXJpb3IgJT4lDQogICAgICAgICAgICAgIHVuZ3JvdXAoKSwgYnkgPSBjKCJlbXByZXNhIiwgImFuaW8iKSkgJT4lIA0KICBtdXRhdGUoaW52ZXJzaW9uX3Bvcl9wb3pvID0gaW52ZXJzaW9uX2V4cGxvdGFjaW9uIC90b3RhbF9wb3pvcykNCg0KI2NvbiBpbnZlcnNpb25lcyBhbnVuY2lhZGFzDQppbnZlcnNpb25fcG96b3NfMiA8LSBwb3pvc19pYXBnICU+JSANCiAgbGVmdF9qb2luKGludmVyc2lvbmVzXzIwMDVfMjAxMiAlPiUNCiAgICAgICAgICAgICAgdW5ncm91cCgpLCBieSA9IGMoImVtcHJlc2EiLCAiYW5pbyIpKSAlPiUgDQogIG11dGF0ZShpbnZlcnNpb25fcG9yX3Bvem8gPSBpbnZlcnNpb25fYW51YWwgL3RvdGFsX3Bvem9zKQ0KDQojZXN0YSBtYWwgcHEgZXMgZmx1am8gZGUgcG96b3MgdnMgc3RvY2sgZGUgY2FwaXRhbA0KIyBrdGFfcG96b3MgPC0gcG96b3NfaWFwZyAlPiUgDQojICAgbGVmdF9qb2luKHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzICU+JQ0KIyAgICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUgDQojICAgICAgICAgICAgICAgc2VsZWN0KC1zZWN0b3IpLCBieSA9IGMoImVtcHJlc2EiLCAiYW5pbyIpKSAlPiUgDQojICAgbXV0YXRlKHBweWVfcG9yX3Bvem8gPSBwcm9wX3BsYW50X2VxdWlwIC90b3RhbF9wb3pvcykNCg0KDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ3JhZl9pbnZlcnNpb25fcG96byA8LSBpbnZlcnNpb25fcG96b3MgJT4lIA0KICBmaWx0ZXIoIGFuaW8gPj0gMjAxMikgJT4lDQogIGdncGxvdChhZXMoYW5pbyxpbnZlcnNpb25fcG9yX3Bvem8sIGNvbG9yID0gZW1wcmVzYSApKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJJbnZlcnNpb25lcyBhw7FvIGFudGVyaW9yIHNvYnJlIHBvem9zIElBUEciLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIpKw0KICB0aGVtZV9jbGFzc2ljKCkNCmdncGxvdGx5KGdyYWZfaW52ZXJzaW9uX3Bvem8sIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApDQoNCmdyYWZfaW52ZXJzaW9uX3Bvem9fMiA8LSBpbnZlcnNpb25fcG96b3NfMiAlPiUgDQogIGZpbHRlciggYW5pbyA8PSAyMDEyKSAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLGludmVyc2lvbl9wb3JfcG96bywgY29sb3IgPSBlbXByZXNhICkpKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBsYWJzKHRpdGxlID0gIkludmVyc2lvbmVzIHJlYWxpemFkYXMgc29icmUgcG96b3MgSUFQRyIsIA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgVVNEIikrDQogIHRoZW1lX2NsYXNzaWMoKQ0KZ2dwbG90bHkoZ3JhZl9pbnZlcnNpb25fcG96b18yLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQoNCkNvbiBwb3pvcyBDYXAgSVYNCmBgYHtyIGVjaG89RkFMU0V9DQojIGNvbiBpbnZlcnNpb25lcyByZWFsaXphZGFzIGHDsW8gYW50ZXJpb3INCmludmVyc2lvbl9wb3pvc19jYXBpdiA8LSBsaXN0YWRvX3Bvem9zICU+JQ0KICByZW5hbWUoYW5pbyA9YW5pb190ZXJtaW5hY2lvbl9wb3pvKSAlPiUgDQogIGxlZnRfam9pbihpbnZlcnNpb25lc19hbmlvX2FudGVyaW9yICU+JQ0KICAgICAgICAgICAgICB1bmdyb3VwKCksIGJ5ID0gYygiZW1wcmVzYSIsICJhbmlvIiApKSAlPiUNCiAgbXV0YXRlKGludmVyc2lvbl9wb3JfcG96byA9IGludmVyc2lvbl9leHBsb3RhY2lvbiAvcG96b3MpDQoNCmdyYWZfaW52ZXJzaW9uX3Bvem8gPC0gaW52ZXJzaW9uX3Bvem9zX2NhcGl2ICU+JSANCiAgZmlsdGVyKCBhbmlvID49IDIwMTIpICU+JQ0KICBnZ3Bsb3QoYWVzKGFuaW8saW52ZXJzaW9uX3Bvcl9wb3pvLCBjb2xvciA9IGVtcHJlc2EgKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAiSW52ZXJzaW9uZXMgYcOxbyBhbnRlcmlvciBzb2JyZSBwb3pvcyBDYXBpdHVsbyBJViIsIA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgVVNEIikrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KZ2dwbG90bHkoZ3JhZl9pbnZlcnNpb25fcG96bywgd2lkdGggPSA3MDAsIGhlaWdodCA9IDQwMCkNCg0KDQpgYGANCg0KDQoNCiMgVmFsb3IgdG90YWwgZGUgbGEgcHJvZHVjY2nDs24geSBnYW5hbmNpYQ0KDQojIyBQQkkNCg0KDQpbUHJvZHVjdG8gSW50ZXJubyBCcnV0byBFeHBsb3RhY2nDs24gTWluYXMgeSBDYW50ZXJhcyBNaWxsb25lcyBkZSBwZXNvcyBjb25zdGFudGVzLiBCYXNlIDE5NjAuIFZhbG9yZXMgdHJpbWVzdHJhbGVzDQpQSUIgRXhwbG90YWNpw7NuIE1pbmFzIHkgQ2FudGVyYXMgZW4gbWlsbG9uZXMgZGUgcGVzb3MgZGUgMTk2MC4gMTk3MC0xOTgwXShodHRwczovL2RhdG9zLmdvYi5hci9kYXRhc2V0L3NzcG0tcHJvZHVjdG8taW50ZXJuby1icnV0by1zZWN0b3JpYWwtMTk3MC0xOTgwKQ0KDQoNCltQcm9kdWN0byBJbnRlcm5vIEJydXRvIEV4cGxvdGFjacOzbiBNaW5hcyB5IENhbnRlcmFzLCBBdXN0cmFsZXMgY29uc3RhbnRlcy4gQmFzZSAxOTcwLlZhbG9yZXMgdHJpbWVzdHJhbGVzDQpQSUIgRXhwbG90YWNpw7NuIE1pbmFzIHkgQ2FudGVyYXMgZW4gYXVzdHJhbGVzIGEgcHJlY2lvcyBkZSAxOTcwLiAxOTgwLTE5OTBdKGh0dHBzOi8vZGF0b3MuZ29iLmFyL2RhdGFzZXQvc3NwbS1wcm9kdWN0by1pbnRlcm5vLWJydXRvLXNlY3RvcmlhbC0xOTgwLTE5OTApIA0KIA0KDQojIyBWYWxvciBCcnV0byBkZSBsYSBQcm9kdWNjacOzbiwgVmFsb3IgQWdyZWdhZG8geSBDb25zdW1vIEludGVybWVkaW8gDQoNClNlIHByZXNlbnRhbiBhIGNvbnRpbnVhY2nDs24gZGlzdGludGFzIGVzdGltYWNpb25lcyBkZWwgVmFsb3IgQnJ1dG8geSBBZ3JlZ2FkbyBkZSBQcm9kdWNjacOzbiAoVkJQIHkgVkEpLCBDb25zdW1vIEludGVyZW1lZGlvIChDSSkgeSAgRXhjZWRlbnRlIEJydXRvIGRlIEV4cGxvdGFjacOzbiAoRUJFKS4gRXN0YSDDumx0aW1hIHBhcnRpZGEgY29uc3RpdHV5ZSBsYSBwbHVzdmFsw61hIChQVikgdG90YWwgZGUgbGEgcmFtYSwgZXMgZGVjaXIsIGxhIHN1bWEgZGUgbGEgcmVudGEgZGUgbGEgdGllcnJhIChSVCkgbcOhcyBsYSBnYW5hbmNpYSBub3JtYWwgKEdub3JtKSwgeSBzZSBvYnRpZW5lIGx1ZWdvIGRlIGRlc2NvbnRhciBkZWwgVkEgc3VzIHJlc3BlY3Rpdm9zIENJLCBNUywgaW1wdWVzdG9zIGVzcGVjw61maWNvcyAoSW1wKSB5IGRlcHJlY2lhY2nDs24gZGUgY2FwaXRhbCBvIGNvbnN1bW8gZGUgY2FwaXRhbCBmaWpvIChDb25zS2Zpam8pLiBMYXMgZGlzdGludGFzIHNlcmllcyBwcmVzZW50YWRhcyBzZSBjb25zdHJ1eWVyb24gc2lndWllbmRvIGxvcyBzaWd1aWVudGVzIGNyaXRlcmlvcyBxdWUgbHVlZ28gc2Ugb2JzZXJ2YXLDoW4gZW4gbGEgZm9ybXVsYWNpw7NuIG1hdGVtw6F0aWNhOg0KDQoNCiogQ0NOTiAoKnZicF92YV9jaV9jY25uKiB5ICpwdl9oaWRyb2NhcmJ1cm9zX2Njbm4qKQ0KICArIFZhbG9yZXMgY29udGFibGVzIG9maWNpYWxlcyBkZSBsYXMgQ3VlbnRhcyBOYWNpb25hbGVzIChzw7NsbyBkaXNwb25pYmxlIHBhcmEgZWwgcGVyw61vZG8gMjAwNC0yMDEyKS4gRGFkbyBxdWUgc2UgcG9zZWUgaW5mb3JtYWNpw7NuIGRlbCBzYWxhcmlvIHByb21lZGlvIGRlbCBzZWN0b3IgeSBlbCBlbXBsZW8sIHNlIHB1ZG8gb2J0ZW5lciBsYSBNUyByZXN1bHRhbnRlLiBBIHBhcnRpciBkZSBlc3RvcyBkYXRvcyBzZSBlbGFib3LDsyB1biBjb2VmaWNpZW50ZSBxdWUgcmVmbGVqYSBlbCBwcm9tZWRpbyBkZSBsYSBwcm9wb3JjacOzbiBkZSBsYSBNUyBzb2JyZSBlbCBWQlAgKHNpbiBkaXN0aW5ndWlyIGV4dHJhY2Npw7NuIHkgc3VzIHJlc3BlY3Rpdm9zIHNlcnZpY2lvcyBkZSBhcG95bykgcXVlIHNlIHV0aWxpemFyw6EgZW4gbG9zIGPDoWxjdWxvcyBwb3N0ZXJpb3Jlcy4gU2UgcG9kcmlhIGFmaW5hciB1bmEgTVMgc29sbyBkZSBleHRyYWNjacOzbi4NCg0KKiBDcml0ZXJpbyBDQ05OICgqdmJwX3ZhX2NpX3Byb3BpYSopDQogICsgRXN0aW1hY2nDs24gcHJvcGlhIGRlIGxvcyB2YWxvcmVzIGNvbnRhYmxlcyBhIHBhcnRpciBkZSBsYXMgZnVlbnRlcyByZWNvcGlsYWRhcywgc2lndWllbmRvIGxvcyBjcml0ZXJpb3MgZGUgbGFzIEN1ZW50YXMgTmFjaW9uYWxlcy4gRXMgZGVjaXIsIHBhcmEgb2J0ZW5lciBlbCBWQlAgc2UgdmFsdWEgbGEgcHJvZHVjY2nDs24gZGVzdGluYWRhIGFsIG1lcmNhZG8gaW50ZXJubyAocmVzdWx0YW50ZSBhIHBhcnRpciBkZSBsYSBkaWZlcmVuY2lhIGVudHJlIHByb2R1Y2Npw7NuIHkgZXhwb3J0YWNpb25lcykgY29uIGxvcyBwcmVjaW9zIGludGVybm9zIHkgbGFzIGV4cG9ydGFjaW9uZXMgY29uIGxvcyBwcmVjaW9zIGRlIGV4cG9ydGFjacOzbiBvIHJlZmVyZW5jaWEgaW50ZXJuYWNpb25hbCwgY29uIHRpcG8gZGUgY2FtYmlvIGNvbWVyY2lhbCAoVENDKS4gRXN0ZSBWQlAgbm8gdGllbmUgZGVzY29udGFkbyBsb3Mgc2VydmljaW9zIGF1eGlsaWFyZXMgYSBsYSBleHRyYWNjacOzbiBkZSBoaWRyb2NhcmJ1cm9zLiBFbCBDb25zdW1vIEludGVybWVkaW8gc2UgZXN0aW1hIGEgcGFydGlyIGRlbCBjb2VmaWNpZW50ZSB0w6ljbmljbyBkZSBsYSBNSVAgZGUgMTk5NyBzb2JyZSBlbCBWQlAgbWVuY2lvbmFkbyBhbnRlcmlvcm1lbnRlLiBEZSBpZ3VhbCBtYW5lcmEsIHBhcmEgY2FsY3VsYXIgbGEgbWFzYSBzYWxhcmlhbCBzZSBhcGxpY8OzIGVsIGNvZWZpY2llbnRlIG1lbmNpb25hZG8gZW4gZWwgcMOhcnJhZm8gYW50ZXJpb3Igc29icmUgZWwgVkJQIGFxdcOtIHJlc3VsdGFudGUuIEZpbmFsbWVudGUsIGNvbW8gc2UgbWVuY2lvbsOzIGFudGVyaW9ybWVudGUsIGVsIFZBIGVsIEVCRSBzZSBjYWxjdWxhcm9uIGEgcGFydGlyIGRlIGxhcyBkaWZlcmVuY2lhcyBtZW5jaW9uYWRhcyBhbnRlcmlvcm1lbnRlLiBFc3RhIGVzdGltYWNpw7NuIGRlIFZCUCBubyB0aWVuZSBkZXNjb250YWRvIGxvcyBzZXJ2aWNpb3MgZGUgYXBveW8gYSBsYSBleHRyYWNjacOzbi4NCg0KQ0NOTiByZWVzdGltYWRvICgqdmJwX2Njbm4qKQ0KICArIEVzdGltYWNpb24gcXVlIHRvbWEgbG9zIHZhbG9yZXMgb2ZpY2lhbGVzIGRlIGxhcyBjdWVudGFzIG5hY2lvbmFsZXMgcGFyYSBlbCBwZXLDrW9kbyBxdWUgaGF5IHZhbG9yZXMgKDIwMDQgLTIwMTIpLCBlIGltcHV0YSBsb3MgdmFsb3JlcyBmYWx0YW50ZXMgcG9yIG1lZGlvIGRlIGxhIGV2b2x1Y2nDs24gZGUgdW4gw61uZGljZSBkZWwgVkJQIHByb3BpbyBjb24gY3JpdGVyaW8gQ0NOTi4gQ2FiZSBzdWJyYXlhciBxdWUgZWwgdmFsb3IgYmFzZSBkZWwgVkJQIHRpZW5lIGRlc2NvbnRhZG8gbG9zIHNlcnZpY2lvcyBkZSBhcG95byBhIGxhIGV4dHJhY2Npw7NuLCBwZXJvIG5vIGFzw60gZWwgVkJQIHV0aWxpemFkbyBlbiBlbCDDrW5kaWNlLiBFbCBDSSBzZSBlc3RpbcOzIGEgcGFydGlyIGRlIGFwbGljYXIgZWwgY29lZmljaWVudGUgdMOpY25pY28gc29icmUgZXN0YSBlc3RpbWFjacOzbiBkZWwgVkJQLCBwb3IgbG8gcWV1IHNlcsOtYSB1biBDSSBzw7NsbyBkZSBleHRyYWNjacOzbi4gU2UgdXRpbGl6YXJvbiBsb3MgdmFsb3JlcyBvZmljaWFsZXMgZGUgbGEgTVMgY3VhbmRvIHNlIGVuY29udHJhYmEgZGlzcG9uaWJsZSBlbCBkYXRvLCBtaWVudHJhcyBxdWUgc2UgcHJvY2VkacOzIGEgaW1wdXRhciBsb3MgZmFsdGFudGVzIHBvciBtZWRpbyBkZWwgY29lZmljaWVudGUgc29icmUgZWwgVkJQLiBDb21vIGVuIHRvZG9zIGxvcyBjYXNvcywgZWwgVkEgeSBFQkUgc3VyZ2VuIGNvbW8gZGlmZXJlbmNpYSBkZSBsYXMgcGFydGlkYXMgYW50ZXJpb3Jlcy4gDQogIA0KQ3JpdGVyaW8gUHJvcGlvICgqcHZfaGlkcm9jYXJidXJvc19wcm9waWEqKQ0KICArIEVzdGltYWNpw7NuIHByb3BpYSBxdWUgcmVmbGVqYSBjb24gbWF5b3IgcHJlY2lzacOzbiBlbCB2YWxvciBkZSBsYSByaXF1ZXphIHByZXNlbnRlIGVuIGVsIHNlY3Rvci4gRWwgVkJQIHNlIG9idGllbmUgYSBwYXJpdHIgZGUgdmFsdWFyIGxhIHRvdGFsaWRhZCBkZSBsYSBwcm9kdWNjacOzbiBhIGxvcyBwcmVjaW9zIGV4dGVybm9zIG8gZGUgcmVmZXJlbmNpYSBpbnRlcm5hY2lvbmFsIHkgY29uIGVsIHRpcG8gZGUgY2FtYmlvIGRlIHBhcmlkYWQgKFRDUCksIHF1ZSBtaWRlIGxhIGNhcGFjaWRhZCByZWFsIGRlIGNvbXByYSBkZSBsYSBtb25lZGEgbmFjaW9uYWwuIFNpbiBlbWJhcmdvLCBjb21vIGVsIENJIGNvbnN0aXR1eWVuIGludGVyY2FtYmlvcyBkZSBtZXJjYW5jw61hcyByZWFsaXphZGFzIGVuIGVsIMOhbWJpdG8gbmFjaW9uYWwsIGRpY2hhIHBhcnRpZGEgc2Ugb2J0aWVuZSBhIHBhcnRpciBkZSBsb3MgdmFsb3JlcyBvYnRlbmlkb3MgZW4gbG9zIGPDoWxjdWxvcyBkZSBjcml0ZXJpbyBDQ05OLiBFcyBkZWNpciwgZWwgQ0kgZXMgY2FsY3VsYWRvIGNvbiBlbCBjb2VmaWNpZW50ZSB0w6ljbmljbyBzb2JyZSBlbCBWQlAgY29uIHByb2R1Y2Npb24gbG9jYWwgdmFsdWFkYSBhIHByZWNpb3MgaW50ZXJub3MgeSBleHBvcmFjaW9uZXMgYSBwcmVjaW9zIGV4dGVybm9zIGNvbiBUQ0MuIEFzaW1pc21vLCBkZSBpZ3VhbCBtYW5lcmEgcXVlIGVuIENyaXRlcmlvIENDTk4sIGxhIE1TIHNlIGVzdGltw7MgYSBwYXJ0aXIgZGVsIGNvZWZpY2llbnRlIHByb21lZGlvIChvYnRlbmlkbyBzb2JyZSBsb3MgdmFsb3JlcyBvZmljaWFsZXMgZGUgQ0NOTikgc29icmUgZWwgVkJQIGVzdGltYWRvIGNvbiBjcml0ZXJpbyBwcm9waW8sIHkgZWwgVkEgeSBlbCBFQkUgYSBwYXJ0aXIgZGUgbGFzIGRpZmVyZW5jaWFzIGVudHJlIGxhcyBwYXJ0aWRhcyBhbnRlcmlvcmVzLiBFcyBpbXBvcnRhbnRlIHN1YnJheWFyIHF1ZSBlc3RlIGPDoWxjdWxvIGRlIFZCUCBubyB0aWVuZSBkZXNjb250YWRvIGxvcyBzZXJ2aWNpb3MgZGUgYXBveW8gYSBsYSBleHRyYWNjacOzbi4NCg0KQ3JpdGVyaW8gUHJvcGlvIGNvbiBWQlAgZGUgQ0NOTiAoKnB2X2hpZHJvY2FyYnVyb3MqKQ0KICArIFRvbWEgZWwgVkJQIGRlIGNyaXRlcmlvIHByb3BpbyB5IHBhcmEgb2J0ZW5lciBlbCBWQSwgc2UgbGUgZGVzY3VlbnRhIGVsIENJIGRlIGV4dHJhY2Npw7NuIGRlIENDTk4gcmVzdGltYWRvIChzaW4gZW1iYXJnbywgY29tbyBzZSBkaWpvLCBlbCBWQlAgbm8gdGllbmUgZGVzY29udGFkbyBsb3Mgc2VydmljaW9zKS4gU2UgdXRpbGl6w7MgdGFtYmllbiBsYSBNUyBlc3RpbWFkYSBlbiBDQ05OIHJlc3RpbWFkby4gRWwgRUJFIHN1cmdlIGNvbW8gZGlmZXJlbmNpYSBkZSBsYXMgcGFydGlkYXMuIA0KDQoNCg0KIyMjIEZvcm11bGFjacOzbiBtYXRlbcOhdGljYSBkZSBsb3MgY8OhbGN1bG9zDQoNCg0KKiBWQlAgY29uIGNyaXRlcmlvIHByb3BpbyANCg0KJCRWQlBfe3Byb3BpYX0gPSAoUGV4dF97cGV0csOzbGVvfSAqIFFfe3BldHLDs2xlb30gKyBQZXh0X3tnYXN9ICogUV97Z2FzfSkgKiBUQ1AkJA0KDQoqIFZCUCBjb24gY3JpdGVyaW8gQ0NOTiANCg0KJCRWQlBfe0NDTk59ID0gKFBpbnRfe3BldHLDs2xlb30gKiBRTUludF97cGV0csOzbGVvfSArIFBleHRfe3BldHLDs2xlb30gKiBFeHBvX3twZXRyw7NsZW99ICsgUGludF97Z2FzfSAqIFFNSW50X3tnYXN9ICsgUGV4dF97Z2FzfSAqIEV4cG9fe2dhc30pKiBUQ0MkJA0KDQoNCkRvbmRlOiANCg0KKiAkVkJQX3twcm9waWF9JCA9IFZhbG9yIEJydXRvIGRlIGxhIFByb2R1Y2Npw7NuLCBlc3RpbWFjacOzbiBwcm9waWENCiogJFZCUF97Q0NOTn0kID0gVmFsb3IgQnJ1dG8gZGUgbGEgUHJvZHVjY2nDs24sICBlc3RpbWFjacOzbiBwcm9waWEgY29uIGNyaXRlcmlvIGRlIGxhcyBDQ05ODQoqICRQZXh0X3twZXRyw7NsZW99JCA9IFByZWNpbyBkZSBleHBvcnRhY2nDs24vcmVmZXJlbmNpYSBpbnRlcm5hY2lvbmFsIGRlbCBwZXRyw7NsZW8gY3J1ZG8NCiogJFBleHRfe2dhc30kID0gUHJlY2lvIGRlIGV4cG9ydGFjacOzbi9yZWZlcmVuY2lhIGludGVybmFjaW9uYWwgZGVsIGdhcyBuYXR1cmFsDQoqICRQaW50X3twZXRyw7NsZW99JCA9IFByZWNpbyBtZXJjYWRvIGludGVybm8gZGVsIHBldHLDs2xlbyBjcnVkbw0KKiAkUGludF97Z2FzfSQgPSBQcmVjaW8gbWVyY2FkbyBpbnRlcm5vIGRlbCBnYXMgbmF0dXJhbA0KKiAkUV97cGV0csOzbGVvfSQgPSBDYW50aWRhZGVzIHByb2R1Y2lkYXMgdG90YWxlcyBkZSBwZXRyw7NsZW8gY3J1ZG8NCiogJFFfe2dhc30kID0gQ2FudGlkYWRlcyBwcm9kdWNpZGFzIHRvdGFsZXMgZGUgZ2FzIG5hdHVyYWwNCiogJFFNSW50X3twZXRyw7NsZW99JCA9IGNhbnRpZGFkZXMgdmVuZGlkYXMgYWwgbWVyY2FkbyBpbnRlcm5vIGRlIHBldHLDs2xlbyBjcnVkbw0KKiAkUU1JbnRfe2dhc30kID0gY2FudGlkYWRlcyB2ZW5kaWRhcyBhbCBtZXJjYWRvIGludGVybm8gZGVsIGdhcyBuYXR1cmFsDQoqICRFeHBvX3twZXRyw7NsZW99JCA9IGV4cG9ydGFjaW9uZXMgZGUgcGV0csOzbGVvIGNydWRvDQoqICRFeHBvX3tnYXN9JCA9IGV4cG9ydGFjaW9uZXMgZGUgZ2FzIG5hdHVyYWwNCiogJFRDQyQgPSBUaXBvIGRlIENhbWJpbyBDb21lcmNpYWwNCiogJFRDUCQgPSBUaXBvIGRlIENhbWJpbyBkZSBQYXJpZGFkDQoNCg0KJCQgQ0lfe3Byb3BpYX0gPSBWQlBfe0NDTk59ICogIENvZWZcX3RlYyAkJA0KIA0KDQokJFZBX3twcm9waWF9ICA9IFZCUF97cHJvcGlhfSDigJMgQ0lfe3Byb3BpYX0gJCQNCg0KDQpEb25kZToNCg0KKiAkQ0lfe3Byb3BpYX0kID0gQ29uc3VtbyBJbnRlcm1lZGlvLCBlc3RpbWFjacOzbiBwcm9waWENCiogJFZBX3twcm9waWF9JCA9IFZhbG9yIEFncmVnYWRvLCBlc3RpbWFjacOzbiBwcm9waWEgDQoqICRDb2VmXF90ZWMkID0gQ29lZmljaWVudGUgdMOpY25pY28gZGUgTWF0cml6IEluc3VtbyBQcm9kdWN0bw0KDQokJE1TX3twcm9waWF9ID0gVyAqIEVtcCAqIDEzJCQNCg0KRG9uZGU6IA0KDQoqICRNU197cHJvcGlhfSQgPSBNYXNhIFNhbGFyaWFsLCBlc3RpbWFjacOzbiBwcm9waWENCiogJFckID0gIFNhbGFyaW8gYW51YWwgcHJvbWVkaW8NCiogJEVtcCQgPSBFbXBsZW8NCg0KJCRDb25LZmlqbyA9IFBQeUUgKiAgcHJvbShcZnJhY3tEZXB9e1BQeUV9KSAkJA0KDQpEb25kZTogDQoNCiogJENvbktmaWpvJCA9IENvbnN1bW8gZGUgQ2FwaXRhbCBGaWpvDQoqICRQUHlFJD0gUHJvcGllZGFkLCBQbGFudGEgeSBFcXVpcG8gbmV0YQ0KKiAkcHJvbShcZnJhY3tEZXB9e1BQeUV9KSAkID0gIHRhc2EgZGUgZGVwcmVjaWFjacOzbiBwcm9tZWRpbw0KKiAkRGVwJCA9IERlcHJlY2lhY2lvbmVzIChjdWVudGEgZ2FzdG9zKQ0KDQoNCiQkUFZfe3Byb3BpYX0gID0gVkFfe3Byb3BpYX0g4oCTIE1TX3twcm9waWF9ICDigJMgQ29uS2Zpam8gLSBJTVAgJCQNCg0KDQpEb25kZToNCg0KKiAgJFBWX3twcm9waWF9JCA9IFBsdXN2YWzDrWEgKCpFeGNlZGVudGUgQnJ1dG8gZGUgRXhwbG90YWNpw7NuKikNCiogICRJTVAkID0gSW1wdWVzdG9zIG5vcm1hbGVzDQoNCkVuIGxvcyBjYXNvcyBlbiBsb3MgcXVlIHNlIHByZXNlbnRhIGRhdG8gZGUgY29uc3VtbyBpbnRlcm1lZGlvIHkgbWFzYSBzYWxhcmlhbCBkZSBsYXMgQ0NOTiwgc2UgcmVhbGl6w7MgZWwgcmVlbXBsYXpvIGRlIGxvcyBkYXRvcyBlc3RpbWFkb3MgcG9yIGxvcyByZWdpc3RyYWRvcyBlbiBDQ05OLg0KDQpDb24gcmVzcGVjdG8gYSBsYSBlc3RpbWFjacOzbiBwcm9waWEsIGVsIGNvbnN1bW8gaW50ZXJtZWRpbyBzZSBlc3RpbcOzIGEgcGFydGlyIGRlIG11bHRpcGxpY2FyIGVsIFZhbG9yIEJydXRvIGRlIFByb2R1Y2Npw7NuIHBvciBlbCBjb2VmaWNpZW50ZSB0w6ljbmljbyByZXN1bHRhbnRlIGRlbCBDdWFkcm8gZGUgVXRpbGl6YWNpb24gZGUgSU5ERUMgYcOxbyAyMDA0IChvYnRlbmlkbyBhIHBhcnRpciBkZWwgcmF0aW8gQ0kvVkJQKS4gU3UgdmFsb3IgZXMgaWd1YWwgMC4zNjksIGxvIGN1YWwgbm8gZXN0w6EgYWxlamFkbyBkZWwgY29lZmljaWVudGUgcHJvbWVkaW8gcmVzdWx0YW50ZSBkZSBsYSBzZXJpZSBkZSBWYWxvciBkZSBsYSBQcm9kdWNjacOzbiBlbiBiYXNlIGEgY3VlbnRhcyBuYWNpb25hbGVzICgwLjQxMikuIFPDrSBzZSBlbmN1ZW50cmEgbcOhcyBhbGVqYWRvIGRlbCBjb2VmaWNpZW50ZSBkZSBsYSBNSVAgYmFzZSAxOTk3ICgwLjI3MikuDQoNClBvciBzdSBwYXJ0ZSwgbGEgbWFzYSBzYWxhcmlhbCBzZSBjYWxjdWzDsyBjb21vIGxhIG11bHRpcGxpY2FjacOzbiBlbnRyZSBsYSByZW11bmVyYWNpw7NuIHByb21lZGlvIGRlIGxhIHJhbWEgcG9yIGVsIGVtcGxlbyByZWdpc3RyYWRvIHBvciBsb3MgMTIgbWVzZXMgZGVsIGHDsW8gbcOhcyBlbCBhZ3VpbmFsZG8uIExvcyBhw7FvcyBmYWx0YW50ZXMgc2UgY29tcGxldGFyb24gcG9yIG1lZGlvIGRlIG11bHRpcGxpY2FyIGVsIFZCUCBwb3IgZWwgcGVzbyBwcm9tZWRpbyBkZSBsYSBtYXNhIHNhbGFyaWFsIHBhcmEgbG9zIGHDsW9zIGNvbiBkYXRvcy4gVW4gbcOpdG9kbyBzaW1pbGFyIGFwbGljYSBEYWNoZXZza3k6IHJlc3VsdGEgZGUgbXVsdGlwbGljYXIgZWwgVkJQIHBvciBsYSBwcm9wb3JjacOzbiBlbnRyZSBsYSByZW11bmVyYWNpw7NuIGEgbG9zIGFzYWxhcmlhZG9zIHNvYnJlIGVsIHZhbG9yIHRvdGFsIGRlIHByb2R1Y2Npw7NuIGRlIFlQRiBwYXJhIGVsIGHDsW8gMTk3My8xOTYzLiANCg0KRWwgY29uc3VtbyBkZSBjYXBpdGFsIGZpam8gc3VyZ2UgZGUgYXBsaWNhciBsYSB0YXNhIGRlIGRlcHJlY2lhY2nDs24gcHJvbWVkaW8gcmVzdWx0YW50ZSBkZSBsb3MgYmFsYW5jZXMgZGUgWVBGICgxOTk4IC0gMjAxOCkgYWwgc3RvY2sgZGUgY2FwaXRhbCBhZGVsYW50YWRvIGVzdGltYWRvICh2ZXIgYXBhcnRhZG8gKkVzdGltYWNpw7NuIGRlIHN0b2NrIGRlIGNhcGl0YWwgYSBwYXJ0aXIgZGUgbGEgZXZvbHVjacOzbiBkZSBwb3pvcyBwZXJmb3JhZG9zKikuIERpY2hvIHByb21lZGlvIHJlc3VsdGEgZW4gdG9ybm8gYWwgMTIlIGRlbCBzdG9jayBkZSBjYXBpdGFsDQoNCg0KDQoNCkNvcnJlY2Npw7NuIFZQQg0KDQpDdWFkcm8gdXRpbGl6YWNpb24gZGUgb2ZlcnRhDQpwZXNvIGRlIGxvcyBzZXJ2aWNpb3MgPSBTZXJ2aWNpb3MgcGV0cm9sZW8vZXh0cmFjY2lvbiA9IDEwLDclICgyKQ0KDQphw7FvcyAyMDA0LTIwMTENCmFwbGljYW1vcyBjb2VmIGEgYmFzZSBtaW5lcmlhL2hpZHJvY2FyYnVyb3MgQ0NOTg0KVkJQIGV4dHJhY2Npb24oIENDTk4pID0gVkJQIGV4dHJhY2Npb24geSBzZXJ2aWNpb3MgKENDTk4pICogMCw4OTMgKDEpDQoNCjE5MTAgLSAyMDE4DQphcm1hciBpbmRpY2UgVkJQIGNyaXRlcmlvIENDTk4gcGFyYSBtb3ZlciAoMSkgbG9zIGHDsW9zIHF1ZSBub3MgZmFsdGFuICgxOTEwIC0gMjAwNCB5IDIwMTIgLTIwMTgpIA0KZGViZXJpYSBzZXIgPSBxdWUgYXBsaWNhciBjb2VmICgyKSBhIFZCUA0KDQoNCiMjIyMgRnVlbnRlcyBwYXJhIGxhIGNvbnN0cnVjY2nDs24gZGUgc2VyaWVzIA0KDQoqIFByb2R1Y2Npw7NuIGRlIENydWRvOiANCiAgKyAxOTExIGEgMTk5MjogQW51YXJpbyBkZSBjb21idXN0aWJsZXMgDQogICsgMTk5MyAtIGFjdHVhbGlkYWQ6IFNFU0NPIERvd25zdHJlYW0NCiAgDQoqIEV4cG9ydGFjaW9uZXMgZGUgQ3J1ZG86IA0KICArIDE5NjIgYSAxOTkzOiBVTiBDb210cmFkZSAoY2xhc2lmaWNhY2nDs24gU0lUQyBhcyByZXBvcnRlZCkNCiAgKyAxOTk0IGVuIGFkZWxhbnRlOiBTRVNDTyBEb3duc3RyZWFtDQogICsgTG9zIGRhdG9zIGZhbHRhbnRlcyBkZSBTRVNDTyBzZSBjb21wbGV0YXJvbiBjb24gTUVDT04NCiAgKyBTaWd1ZW4gaGFiaWVuZG8gZGF0b3MgZmFsdGFudGVzIHBhcmEgbG9zIGHDsW9zIDE5NjUsIDE5NzAtNzQsIDE5NzYtNzgsIDE5ODAtODQNCiAgDQoqIFByZWNpbyBNZXJjYWRvIEludGVybm8gZGUgQ3J1ZG86IA0KICArIDE5NjMgYSAxOTY1OiBLb3p1bGogeSBQaXN0b25lc2kgLSBSZXZpc3RhIElERUUgYWp1c3RhZG8gY29uIGVsIMOtbmRpY2UgZGVsIHByZWNpbyBkZWwgQW51YXJpbyBkZSBZUEYgDQogICsgMTk4OSBhIDE5OTE6IEFudWFyaW8gZGUgWVBGDQogICsgMTk2NiBhIDE5ODg6IEtvenVsaiB5IFBpc3RvbmVzaSAtIFJldmlzdGEgSURFRQ0KICArIDE5OTI6IE1FQ09OIGFqdXN0YWRvIGNvbiBsYSB2YXJpYWNpw7NuIGRlbCDDjW5kaWNlIGRlIHByZWNpb3MgaW50ZXJub3MgYWwgcG9yIG1heW9yIChJUElNKQ0KICArIDE5OTMgZW4gYWRlbGFudGU6IE1FQ09OIA0KICANCiogUHJlY2lvIE1lcmNhZG8gRXh0ZXJubyBDcnVkbzoNCiAgKyBlbnRyZSAxOTYyIHkgMTk5MjogcHJlY2lvIGRlIGV4cG9ydGFjacOzbiBhcmdlbnRpbmEgZGUgVU4gQ29tdHJhZGUNCiAgKyBlbnRyZSAxOTkzLTIwMDEgeSAyMDA0LTIwMTQ6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gYXJnZW50aW5hIGRlIE1lY29uDQogICsgZW50cmUgMjAwMiB5IDIwMDM6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gZGUgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlIChDbGFzaWZpY2FjacOzbiBIUyBhcyByZXBvcnRlZCkgIA0KICArIDIwMTQgZW4gYWRlbGFudGU6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gYXJnZW50aW5hIGRlIFNlY3JldGFyw61hIGRlIEVuZXJnw61hIChSZWdhbMOtYXMpDQogICsgVmFsb3JlcyBmYWx0YW50ZXMgcHJldmlvcyBhIDE5OTI6IEJyZW50ICAoRnVlbnRlOiBJbmZsYXRpb24gRGF0YSkNCiAgDQoqIFByb2R1Y2Npw7NuIGRlIEdhczoNCiAgKyAxOTExIGEgMTk5MjogQW51YXJpbyBkZSBjb21idXN0aWJsZXMgDQogICsgMTk5MyBlbiBhZGVsYW50ZTogU0VTQ08gRG93bnN0cmVhbQ0KICANCiogRXhwb3J0YWNpb25lcyBkZSBnYXM6IA0KICArIDE5NjIgYSAxOTk2OiBVTiBDb210cmFkZSwNCiAgKyAxOTk3IGVuIGFkZWxhbnRlOiBTRVNDTyBEb3duc3RyZWFtDQogICsgRGF0b3MgZmFsdGFudGVzIHBhcmEgbG9zIGHDsW9zIDE5OTkgeSAyMDAwDQogIA0KKiBQcmVjaW8gTWVyY2FkbyBJbnRlcm5vIGRlIGdhczoNCiAgKyAxOTYzIC0gMTk2OSAmIDE5ODkgLSAxOTkyOiBBbnVhcmlvIGRlIFlQRg0KICArIDE5NzAgLSAxOTg4OiAgS296dWxqIHkgUGlzdG9uZXNpIC0gUmV2aXN0YSBJREVFDQogICsgMTk5MyBlbiBhZGVsYW50ZTogU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgLSBCYXNlIFJlZ2Fsw61hcw0KICArIEVsIGRhdG8gZGVsIGHDsW8gMTk5MiBzZSBkaXZpZGnDsyBwb3IgMTAsIGRhZG8gcXVlIHJlc3VsdGFiYSBleGNlc2l2YW1lbnRlIGFsdG8sIGxvIGN1YWwgZXMgbWV0b2RvbMOzZ2ljYW1lbnRlIGluYWNlcHRhYmxlIHBlcm8gc2lydmUgZGUgZWplcmNpY2lvLiANCiAgDQoqIFByZWNpbyBNZXJjYWRvIEV4dGVybm86DQogICsgQcOxb3MgMTk2NCB5IDE5NjU6IFByZWNpbyBkZSBpbXBvcnRhY2nDs24gZGUgZ2FzIHByb3ZlbmllbnRlIGRlIEJvbGl2aWEgaGFjaWEgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlDQogICsgMTk2NiBlbiBhZGVsYW50ZTogUHJlY2lvIGRlIGV4cG9ydGFjaW9uIGRlIGdhcyBkZXNkZSBCb2xpdmlhIGEgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlDQogICsgRGF0b3MgZmFsdGFudGVzIHBhcmEgbG9zIGHDsW9zIHByZXZpb3MgYSAxOTYzIHkgcGVyw61vZG8gMTk2OC0xOTcxIA0KDQoqIFZhbG9yIEJydXRvIGRlIGxhIFByb2R1Y2Npw7NuLCBWYWxvciBBZ3JlZ2FkbyB5IENvbnN1bW8gSW50ZXJtZWRpbzoNCiAgKyBJTkRFQyAtIERpcmVjY2nDs24gTmFjaW9uYWwgZGUgQ3VlbnRhcyBOYWNpb25hbGVzIChCYXNlIE1pbmVyw61hIGUgSGlkcm9jYXJidXJvcyBkZSBsYXMgQ3VlbnRhcyBOYWNpb25hbGVzKS4gTGFzIHZhcmlhYmxlcyAiZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zIiByZWZpZXJlbiBhICJFeHRyYWNjacOzbiBkZSBwZXRyw7NsZW8gY3J1ZG8geSBnYXMgbmF0dXJhbC4gQWN0aXZpZGFkZXMgZGUgc2VydmljaW9zIHJlbGFjaW9uYWRhcyBjb24gbGEgZXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIHkgZ2FzLCBleGNlcHRvIGxhcyBhY3RpdmlkYWRlcyBkZSBwcm9zcGVjY2nDs24iDQogICsgQ8OhbGN1bG8gcHJvcGlvIGRlbCBWQlAgY29uIGRhdG9zIGRhdG9zIGRlIHByb2R1Y2Npw7NuIHkgcHJlY2lvIGludGVybmFjaW9uYWwgcmVjb3BpbGFkb3MuIExhcyBmdWVudGVzIHNvbiBsYXMgc2lndWllbnRlcyAobG9zIGNyaXRlcmlvcyBzb24gbG9zIG1pc21vcyBwYXJhIGxhIHV0aWxpemFjacOzbiBwb3N0ZXJpb3IgZW4gZWwgY8OhbGN1bG8gZGUgcmVudGEgZGUgbGEgdGllcnJhIGhpZHJvY2FyYnVyw61mZXJhIHBvciBkaWZlcmVuY2lhbCBkZSBwcmVjaW9zLCBzb2JyZXZhbHVhY2nDs24gY2FtYmlhcmlhIHkgb3Ryb3MgbWVjYW5pc21vcykNCg0KKiBTYWxhcmlvIHkgZW1wbGVvDQogICsgTVRFeVNTIChCYXNlIE1pbmVyw61hIGUgSGlkcm9jYXJidXJvcyBkZSBsYXMgQ3VlbnRhcyBOYWNpb25hbGVzKQ0KICArIFtNaW5pc3RlcmlvIGRlIFRyYWJham8sIEVtcGxlbyB5IFNlZ3VyaWRhZCBTb2NpYWwgLSBPYnNlcnZhdG9yaW8gZGUgRW1wbGVvIHkgRGluw6FtaWNhIEVtcHJlc2FyaWFsIChPRURFKV0oaHR0cDovL3d3dy50cmFiYWpvLmdvYi5hci9lc3RhZGlzdGljYXMvb2VkZS9lc3RhZGlzdGljYXNuYWNpb25hbGVzLmFzcCkNCiAgKyBFUEggPz8NCjxicj4NCg0KDQoNCiMjIyBFc3RpbWFjacOzbiBwb3IgQ3VlbnRhcyBOYWNpb25hbGVzDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KDQojY29lZiBDSQ0KI01JUA0KIyBjb2VmaWNpZW50ZXMgZGUgcmVxdWVyaW1pZW50b3MgZGlyZWN0b3MNCg0KIyBleHRyYWlkbyBkZSBNSVAgOTcgYSBwYXJ0aXIgZGUgQ0kvVkJQIA0KIyBjb2VmX3JlcV9kaXJlY3RvcyA8LSAgMC4yNzIyNjQ2MzgNCg0KIyBleHRyYWlkbyBkZSBjdWFkcm8gZGUgdXRpbGl6YWNpb24gMjAwNCBhIHBhcnRpciBkZSBDSS9WQlANCmNvZWZfdGVjbmljbyA8LSAgMC4zNjkxMDQzMDINCg0KY29lZl90ZWNuaWNvXzk3IDwtIDAuMzc0MTI1ODg3DQoNCg0KDQojUGVzbyBkZSBsb3Mgc2VydmljaW9zDQojQ1VPIA0KI2xhIHN1bWEgZGUgbGFzIGNvbHVtbmFzIG5vcyBkYSBlbCBWQlANCkNPVSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9NSVAvc2hfY291XzA2XzE2LnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUNCiAgcmVuYW1lKHNlY3RvciA9ICIuLi4xIiwNCiAgICAgICAgIGNwYyA9ICIuLi4yIikgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChzZWN0b3IsICJcXGQiKSAmICEoc3RyX2RldGVjdChzZWN0b3IsICJeTiIpKSkNCg0Kc2VydmljaW9fc19leHRyYWNjaW9uIDwtICBzdW0oQ09VWzEyXSkvc3VtKENPVVsxMV0pDQpucm93KENPVSkNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojQ0NOTg0KdmJwX3ZhX2NpX2Njbm4gPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NZWNvbi9iYXNlLW1pbmVyaWEtZS1oaWRyb2NhcmJ1cm9zIGN1ZW50YXMgbmFjaW9uYWxlcy54bHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAiQ3VlbnRhcyBOYWNpb25hbGVzIiwgc2tpcCA9IDUpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiQcOxbyIsDQogICAgICAgICBwZXJpb2RvID0iUGVyw61vZG8iLA0KICAgICAgICB2YnBfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zID0gICIuLi41IiwNCiAgICAgICAgdmFfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zID0gICIuLi4xNSIpICU+JSANCiAgZmlsdGVyKGlzLm5hKHBlcmlvZG8pLCAhaXMubmEoYW5pbykgKSAlPiUgICNmaWx0cmFtb3MgbG9zIGRhdG9zIGFudWFsZXMNCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxlcyBkZSBwZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgIHZicF9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3M9IGFzLmRvdWJsZSh2YnBfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zKSwNCiAgICAgICAgIHZhX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcz0gYXMuZG91YmxlKHZhX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyksDQogICAgICAgICB2YnBfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zID0gdmJwX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyAqICgxIC0gc2VydmljaW9fc19leHRyYWNjaW9uKSwNCiAgICAgICAgIHZhX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyA9IHZhX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyAqICgxIC0gc2VydmljaW9fc19leHRyYWNjaW9uKSwNCiAgICAgICAgIGNpX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcz0NCiAgICAgICAgICAgdmJwX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcy12YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICBjaV9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MgPSB2YnBfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zIC0gdmFfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsDQogICAgICAgICB2YnBfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zICwgDQogICAgICAgICB2YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICBjaV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICB2YnBfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zICwgDQogICAgICAgICB2YV9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICBjaV9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkKSAlPiUNCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7eC8xMF4zfSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICBjb2VmX3JlcV9leHRyX3lfc2VydiA9Y2lfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zL3ZicF9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICBjb2VmX3JlcV9leHRyID0gY2lfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zL3ZicF9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MpICU+JSANCiAgZmlsdGVyKCEoaXMubmEoY29lZl9yZXFfZXh0cl95X3NlcnYpKSkNCnZicF92YV9jaV9jY25uDQoNCm1lYW5fY29lZl9yZXFfZXh0cl9jY25uIDwtIG1lYW4odmJwX3ZhX2NpX2Njbm4kY29lZl9yZXFfZXh0cikNCm1lYW5fY29lZl9yZXFfZXh0cl9jY25uX2IgPC0gbWVhbihzdW0odmJwX3ZhX2NpX2Njbm4kY2lfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zKS8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0odmJwX3ZhX2NpX2Njbm4kdmJwX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcykpDQoNCmBgYA0KDQojIyMgRXN0aW1hY2lvbmVzIGVuIGJhc2UgYSBmdWVudGVzIHJlY29waWxhZGFzLiBNZXRvZG9sb2fDrWEgcHJvcGlhIHkgQ0NOTg0KDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcHJlY2lvc195X2NhbnRpZGFkZXMgPC0gcHJvZF9tZXJnZV9jcnVkbyAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWRfY2FudF9jcnVkbyA9IHVuaWRhZCwgcHJvZF9jcnVkbykgJT4lDQogIGxlZnRfam9pbihleHBvX3FfY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRfY3J1ZG8gPXVuaWRhZCwgZXhwb19jcnVkbykpICU+JSANCiAgbGVmdF9qb2luKGV4aXN0ZW5jaWFzX3BldHJvbGVvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZF9jYW50X2NydWRvID0gdW5pZGFkLCBleGlzdGVuY2lhc19jcnVkbykpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGV4aXN0ZW5jaWFzX2NydWRvPTAgKSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoZXhwb19jcnVkbz0wICkpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19taV9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWRfcHJlY2lvX2NydWRvID0gdW5pZGFkLCBwcmVjaW9fY3J1ZG9fbWRvaW50KSwgYnkgPSAiYW5pbyIpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkX3ByZWNpb19jcnVkbyA9IHVuaWRhZCwgcHJlY2lvX21lX2NydWRvKSwgYnkgPSBjKCJhbmlvIiwgInVuaWRhZF9wcmVjaW9fY3J1ZG8iKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJvZF9tZXJnZV9nYXNfTU1CVFUgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRfZ2FzPSB1bmlkYWQscHJvZF9nYXMpLCBieSA9ICJhbmlvIikgJT4lDQogIGxlZnRfam9pbihleHBvX3FfZ2FzX01NQlRVICU+JSBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRfZ2FzPSB1bmlkYWQsIGV4cG9fZ2FzKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZF9wcmVjaW9fZ2FzID0gdW5pZGFkLCBwcmVjaW9fZXh0ZXJub19nYXMpLCBieSA9ICJhbmlvIikgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX2ludGVybm9fZ2FzX21tYnR1X3VzZCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgcHJlY2lvX2dhc19tZG9pbnQpKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB0Y3AsIHRjYyksIGJ5ID0gImFuaW8iKQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnZicF92YV9jaV9wcm9waWEgPC0gcHJlY2lvc195X2NhbnRpZGFkZXMgJT4lIA0KICBtdXRhdGUoY3J1ZG9fbWRvX2ludGVybm8gPSBwcm9kX2NydWRvIC0gZXhwb19jcnVkbywNCiAgICAgICAgIGV4cG9fZ2FzID0gcmVwbGFjZV9uYShleHBvX2dhcywgMCApLA0KICAgICAgICAgZ2FzX21kb19pbnRlcm5vID0gcHJvZF9nYXMgLSBleHBvX2dhcywNCiAgICAgICAgIHVuaWRhZF92YWxvcl9wcm9kdWNjaW9uID0gIk1pbGxvbmVzIGRlIHBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgdmJwX2NyaXRlcmlvX2Njbm4gPSAoKGNydWRvX21kb19pbnRlcm5vKnByZWNpb19jcnVkb19tZG9pbnQrDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvX2NydWRvKnByZWNpb19tZV9jcnVkbw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2FzX21kb19pbnRlcm5vICogcHJlY2lvX2dhc19tZG9pbnQgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK2V4cG9fZ2FzKnByZWNpb19leHRlcm5vX2dhcyApKnRjYykvMTBeNiwNCiAgICAgICAgIHZhbG9yX2JydXRvX2NydWRvID0gKHByb2RfY3J1ZG8qcHJlY2lvX21lX2NydWRvKnRjcCkvMTBeNiwNCiAgICAgICAgIHZhbG9yX2JydXRvX2dhcyA9ICAgKHByb2RfZ2FzICogcHJlY2lvX2V4dGVybm9fZ2FzKnRjcCkvMTBeNiwNCiAgICAgICAgIHZicF9jcml0ZXJpb19wcm9waW8gPSB2YWxvcl9icnV0b19jcnVkbyArIHZhbG9yX2JydXRvX2dhcywgDQogICAgICAgICBjb25zdW1vX2ludGVybWVkaW8gPSB2YnBfY3JpdGVyaW9fY2NubiAqIGNvZWZfdGVjbmljbywNCiAgICAgICAgIHZhbG9yX2FncmVnYWRvID0gdmJwX2NyaXRlcmlvX3Byb3BpbyAtIGNvbnN1bW9faW50ZXJtZWRpbyApDQp2YnBfdmFfY2lfcHJvcGlhDQoNCmluZGljZV92YnBfY3JpdGVyaW9fY2NubiA8LSB2YnBfdmFfY2lfcHJvcGlhICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHZicF9jcml0ZXJpb19jY25uXzA0ID0gZ2VuZXJhcl9pbmRpY2UodmJwX2NyaXRlcmlvX2Njbm4sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhID0gYW5pbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9IDIwMDQpLA0KICAgICAgICAgdmJwX2NyaXRlcmlvX2Njbm5fMTIgPSBnZW5lcmFyX2luZGljZSh2YnBfY3JpdGVyaW9fY2NubiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGEgPSBhbmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYV9iYXNlID0gMjAxMikpICU+JSANCiAgc2VsZWN0KGFuaW8sIHZicF9jcml0ZXJpb19jY25uXzA0LHZicF9jcml0ZXJpb19jY25uXzEyKQ0KDQoNCmBgYA0KDQoNCg0KIyMgRW1wbGVvLCBSZW11bmVyYWNpb25lcyB5IE1hc2EgU2FsYXJpYWwgKENDTk4pDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI2FudWFyaW9zIENFUEFMDQpjZXBhbF8xOTkxIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvQ0VQQUwvY2VwYWxfMTk5MS54bHN4IikgJT4lIA0KICBtdXRhdGUodmFsb3IgPSB2YWxvciAvIGNvbnZlcnNvcl9wZXNvcyRBIC8xMF4zLA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIGNvcnJpZW50ZXMiKQ0KDQptYXNhX3NhbGFyaWFsX2NlcGFsIDwtIGNlcGFsXzE5OTEgJT4lIA0KICBmaWx0ZXIodmFyaWFibGUgPT0gInJlbXVuZXJhY2lvbl9hbF90cmFiYWpvIikgJT4lIA0KICByZW5hbWUobXNfY2VwYWwgPSB2YWxvcikNCiAgDQoNCiNjb24gZGF0b3MgZGUgbGEgYmFzZSBkZSBDQ05ODQplbXBsZW8gPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NZWNvbi9iYXNlLW1pbmVyaWEtZS1oaWRyb2NhcmJ1cm9zIGN1ZW50YXMgbmFjaW9uYWxlcy54bHMiLCANCiAgICBzaGVldCA9ICJFbXBsZW8gcmVnaXN0cmFkbyIsIHNraXAgPSA1KSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDsW8iLA0KICAgICAgICAgIHBlcmlvZG8gPSJQZXLDrW9kbyIsDQogICAgICAgICBlbXBsZW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zID0gIi4uLjciLA0KICAgICAgICBlbXBsZW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgPSAiLi4uOCIgKSAlPiUNCiAgIGZpbHRlcihpcy5uYShwZXJpb2RvKSwgIWlzLm5hKGFuaW8pICkgJT4lDQogIHNlbGVjdChhbmlvLCBlbXBsZW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zLGVtcGxlb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyApICU+JSANCiAgbXV0YXRlKHVuaWRhZF9lbXBsZW8gPSAiUHVlc3RvcyBkZSB0cmFiYWpvIiwNCiAgICAgICAgIGVtcGxlb19leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MgPSBhcy5kb3VibGUoZW1wbGVvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyksDQogICAgICAgICBlbXBsZW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgPSBhcy5kb3VibGUoZW1wbGVvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zKSkgDQogIA0KDQpzYWxhcmlvcyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01lY29uL2Jhc2UtbWluZXJpYS1lLWhpZHJvY2FyYnVyb3MgY3VlbnRhcyBuYWNpb25hbGVzLnhscyIsIA0KICAgIHNoZWV0ID0gIlJlbXVuZXJhY2lvbmVzIiwgY29sX3R5cGVzID0gYygibnVtZXJpYyIsIA0KICAgICAgICAiZGF0ZSIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAgICAgInRleHQiKSwgc2tpcCA9IDUpICU+JSANCiAgICByZW5hbWUoYW5pbyA9ICJBw7FvIiwNCiAgICAgICAgICBwZXJpb2RvID0iUGVyw61vZG8iLA0KICAgICAgICAgIHNhbGFyaW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zID0gIi4uLjciLA0KICAgICAgICAgc2FsYXJpb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyA9ICAiLi4uOCIpICU+JSANCiAgZmlsdGVyKCFpcy5uYShhbmlvKSAmIGFuaW8gPCAyMDE0KSAlPiUgDQogIHNlbGVjdChhbmlvLCBzYWxhcmlvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyxzYWxhcmlvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zICkgJT4lIA0KICBtdXRhdGUodW5pZGFkX3NhbGFyaW8gPSAiUGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICBzYWxhcmlvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcz0gYXMuZG91YmxlKHNhbGFyaW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zKSwNCiAgICAgICAgc2FsYXJpb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyA9IGFzLmRvdWJsZShzYWxhcmlvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zKSkNCiAgIA0KbWFzYV9zYWxhcmlhbF9jY25uIDwtIGVtcGxlbyAlPiUgDQogIGxlZnRfam9pbihzYWxhcmlvcywgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHVuaWRhZF9tYXNhX3NhbGFyaWFsID0gIk1pbGxvbmVzIGRlIHBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgbWFzYV9zYWxhcmlhbF9leHRyYWNjaW9uID0gKHNhbGFyaW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zICplbXBsZW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zKjEzKS8xMF42LA0KICAgICAgICAgbWFzYV9zYWxhcmlhbF9zZXJ2aWNpb3MgPSAoc2FsYXJpb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyAqZW1wbGVvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zKjEzKS8xMF42LA0KICAgICAgICAgbWFzYV9zYWxhcmlhbF90b3RhbCA9IG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbiArIG1hc2Ffc2FsYXJpYWxfc2VydmljaW9zKSANCg0KDQoNCiNjb24gZGF0b3MgZGUgZW1wbGVvIHJlZ2lzdHJhZG8gDQpyZW11bmVyYWNpb25lc19hbnVhbCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01pbmlzdGVyaW8gVHJhYmFqby9uYWNpb25hbF9zZXJpZV9yZW11bmVyYWNpb25lc19hbnVhbC54bHN4IiwgDQogICAgc2hlZXQgPSAiQyA1IiwgY29sX3R5cGVzID0gYygic2tpcCIsIA0KICAgICAgICAidGV4dCIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiKSwgc2tpcCA9IDQpICU+JSANCiAgZ2F0aGVyKGtleSA9IGFuaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMjpuY29sKC4pKSAlPiUNCiAgcmVuYW1lKHJhbWFfYWN0aXZpZGFkID0gIlJhbWEgZGUgYWN0aXZpZGFkIikgJT4lIA0KICBmaWx0ZXIoIHN0cl9kZXRlY3QocmFtYV9hY3RpdmlkYWQsICJwZXRyw7NsZW8iKSkgJT4lIA0KICBtdXRhdGUodW5pZGFkX3NhbGFyaW8gPSAiUGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICByYW1hX2FjdGl2aWRhZD0gDQogICAgICAgICAgIGNhc2Vfd2hlbihyYW1hX2FjdGl2aWRhZD09DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGl2aWRhZGVzICBkZSBzZXJ2aWNpb3MgcmVsYWNpb25hZGFzIGNvbiBsYSBleHRyYWNjacOzbiBkZSBwZXRyw7NsZW8geSBnYXMsIGV4Y2VwdG8gbGFzIGFjdGl2aWRhZGVzIGRlIHByb3NwZWNjacOzbiIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtdW5lcmFjaW9uX3NlcnZpY2lvc19leHRyYWNjaW9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtYV9hY3RpdmlkYWQ9PQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHRyYWNjacOzbiBkZSBwZXRyw7NsZW8gY3J1ZG8geSBnYXMgbmF0dXJhbCIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtdW5lcmFjaW9uX2V4dHJhY2Npb25fcGV0cm9sZW9fZ2FzIikpICU+JSANCiAgICBmaWx0ZXIoIShpcy5uYShyYW1hX2FjdGl2aWRhZCkpKSAlPiUgDQogIHNwcmVhZChrZXkgPSByYW1hX2FjdGl2aWRhZCwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IpDQogIA0KDQoNCmVtcGxlb19hbnVhbCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01pbmlzdGVyaW8gVHJhYmFqby9uYWNpb25hbF9zZXJpZV9lbXBsZW9fYW51YWwueGxzeCIsIA0KICAgIHNoZWV0ID0gIkMgNSIsIGNvbF90eXBlcyA9IGMoInNraXAiLCANCiAgICAgICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsIA0KICAgICAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAgICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsIA0KICAgICAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiksIA0KICAgIHNraXAgPSA0KSU+JSANCiAgZ2F0aGVyKGtleSA9IGFuaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMjpuY29sKC4pKSAlPiUNCiAgcmVuYW1lKHJhbWFfYWN0aXZpZGFkID0gIlJhbWEgZGUgYWN0aXZpZGFkIikgJT4lIA0KICBmaWx0ZXIoIHN0cl9kZXRlY3QocmFtYV9hY3RpdmlkYWQsICJwZXRyw7NsZW8iKSkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSBhcy5kb3VibGUodmFsb3IpLA0KICAgICAgICAgdW5pZGFkX2VtcGxlbyA9ICJQdWVzdG9zIGRlIHRyYWJham8iLA0KICAgICAgICAgcmFtYV9hY3RpdmlkYWQ9IGNhc2Vfd2hlbihyYW1hX2FjdGl2aWRhZD09DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGl2aWRhZGVzICBkZSBzZXJ2aWNpb3MgcmVsYWNpb25hZGFzIGNvbiBsYSBleHRyYWNjacOzbiBkZSBwZXRyw7NsZW8geSBnYXMsIGV4Y2VwdG8gbGFzIGFjdGl2aWRhZGVzIGRlIHByb3NwZWNjacOzbiIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW1wbGVvX3NlcnZpY2lvc19leHRyYWNjaW9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtYV9hY3RpdmlkYWQ9PQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHRyYWNjacOzbiBkZSBwZXRyw7NsZW8gY3J1ZG8geSBnYXMgbmF0dXJhbCIgfiAiZW1wbGVvX2V4dHJhY2Npb25fcGV0cm9sZW9fZ2FzIikpICU+JSANCiAgZmlsdGVyKCEoaXMubmEocmFtYV9hY3RpdmlkYWQpKSkgJT4lIA0KICBzcHJlYWQoa2V5ID0gcmFtYV9hY3RpdmlkYWQsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yKQ0KDQptYXNhX3NhbGFyaWFsX29lZGUgPC0gZW1wbGVvX2FudWFsICU+JSANCiAgbGVmdF9qb2luKHJlbXVuZXJhY2lvbmVzX2FudWFsLCBieSA9ICJhbmlvIikgJT4lIA0KICBtdXRhdGUodW5pZGFkX21hc2Ffc2FsYXJpYWwgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICBtYXNhX3NhbGFyaWFsX2V4dHJhY2Npb24gPSAoICByZW11bmVyYWNpb25fZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMgKmVtcGxlb19leHRyYWNjaW9uX3BldHJvbGVvX2dhcyoxMykvMTBeNiwNCiAgICAgICAgIG1hc2Ffc2FsYXJpYWxfc2VydmljaW9zID0gKHJlbXVuZXJhY2lvbl9zZXJ2aWNpb3NfZXh0cmFjY2lvbiAqZW1wbGVvX3NlcnZpY2lvc19leHRyYWNjaW9uKjEzKS8xMF42LA0KICAgICAgICAgbWFzYV9zYWxhcmlhbF90b3RhbCA9IG1hc2Ffc2FsYXJpYWxfc2VydmljaW9zICsgbWFzYV9zYWxhcmlhbF9leHRyYWNjaW9uLA0KICAgICAgICAgYW5pbyA9YXMuZG91YmxlKGFuaW8pKQ0KDQptYXNhX3NhbGFyaWFsX2hpZHJvY2FyYnVyb3MgPC0gbWFzYV9zYWxhcmlhbF9jY25uICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9tYXNhX3NhbGFyaWFsLCBtYXNhX3NhbGFyaWFsX2Njbm4gPSBtYXNhX3NhbGFyaWFsX3RvdGFsKSAlPiUgDQogIGZ1bGxfam9pbihtYXNhX3NhbGFyaWFsX29lZGUgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX21hc2Ffc2FsYXJpYWwsIA0KICAgICAgICAgICAgICAgICAgICAgbWFzYV9zYWxhcmlhbF9vZWRlID1tYXNhX3NhbGFyaWFsX3RvdGFsKSkgJT4lIA0KICBmdWxsX2pvaW4obWFzYV9zYWxhcmlhbF9jZXBhbCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIG1zX2NlcGFsKSkgJT4lIA0KICBtdXRhdGUobXMgPSBjYXNlX3doZW4oYW5pbyA8IDE5OTYgfiBtc19jZXBhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPj0gMTk5NiB+bWFzYV9zYWxhcmlhbF9vZWRlKSkgJT4lIA0KICBhcnJhbmdlKGFuaW8pDQptYXNhX3NhbGFyaWFsX2hpZHJvY2FyYnVyb3MgIA0KDQoNCmBgYA0KDQojIyBQbHVzdmFsw61hIHRvdGFsIGRlbCBzZWN0b3INCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNDQ05ODQojY29uIGJhc2UgZGUgY3VlbnRhcyBuYWNpb25hbGVzDQpwdl9oaWRyb2NhcmJ1cm9zX2Njbm4gPC0gdmJwX3ZhX2NpX2Njbm4gJT4lIA0KICBsZWZ0X2pvaW4obWFzYV9zYWxhcmlhbF9oaWRyb2NhcmJ1cm9zICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICB1bmlkYWQsDQogICAgICAgICAgICAgICAgICAgICBtYXNhX3NhbGFyaWFsID0gbWFzYV9zYWxhcmlhbF9vZWRlKSwgYnkgPSBjKCJhbmlvIiwgInVuaWRhZCIpKSAlPiUgDQogIG11dGF0ZShleGNlZGVudGVfYnJ1dG9fZXhwbG90YWNpb24gPSB2YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgLW1hc2Ffc2FsYXJpYWwpICU+JSANCiAgcmVuYW1lKHZhbG9yX2JydXRvX3Byb2R1Y2Npb24gPSB2YnBfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgY29uc3Vtb19pbnRlcm1lZGlvID0gY2lfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgdmFsb3JfYWdyZWdhZG89IHZhX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcykNCg0KDQoNCiNjb24gYmFzZSBkZSBWQlAgZGUgZWxhYm9yYWNpb24gcHJvcGlhDQptZWFuX2NvZWZfbXMgPC0gIG1lYW4oKHB2X2hpZHJvY2FyYnVyb3NfY2NubiAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKGNvZWZfbWFzYV9zYWxhcmlhbCA9IG1hc2Ffc2FsYXJpYWwvdmFsb3JfYnJ1dG9fcHJvZHVjY2lvbikgJT4lIA0KICBmaWx0ZXIoIShpcy5uYShjb2VmX21hc2Ffc2FsYXJpYWwpKSkpJGNvZWZfbWFzYV9zYWxhcmlhbCkNCg0KbWVkaWFuX2NvZWZfbXMgPC0gIG1lZGlhbigocHZfaGlkcm9jYXJidXJvc19jY25uICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UoY29lZl9tYXNhX3NhbGFyaWFsID0gbWFzYV9zYWxhcmlhbC92YWxvcl9icnV0b19wcm9kdWNjaW9uKSAlPiUgDQogIGZpbHRlcighKGlzLm5hKGNvZWZfbWFzYV9zYWxhcmlhbCkpKSkkY29lZl9tYXNhX3NhbGFyaWFsKQ0KDQojY29lZmljaWVudGUgRkQNCiMgY29lZl9zYWxhcmlvIDwtIDAuMTkNCg0KY29uc3Vtb19rX2Zpam9feXBmIDwtIChyZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvQmFsYW5jZXMvZ2FzIHkgcGV0cm9sZW9fZGF0b3MvZGF0b3Nfci9yZXN1bHRhZG9zL2JhbGFuY2VzX2FyZy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpICU+JQ0KICBmaWx0ZXIoZW1wcmVzYSA9PSAiWVBGIikgJT4lIA0KICBncm91cF9ieShlbXByZXNhKSAlPiUgDQogIG11dGF0ZSh0YXNhX2RlcHJlY2lhY2lvbiA9IGRlcHJlY2lhY2lvbmVzL3BweWUpICU+JSANCiAgc3VtbWFyaXNlKHRhc2FfZGVwcmVjaWFjaW9uID0gbWVhbihkZXByZWNpYWNpb25lcy9wcHllKSkpJHRhc2FfZGVwcmVjaWFjaW9uDQoNCnZhcigocmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0JhbGFuY2VzL2dhcyB5IHBldHJvbGVvX2RhdG9zL2RhdG9zX3IvcmVzdWx0YWRvcy9iYWxhbmNlc19hcmcuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKSAlPiUNCiAgZmlsdGVyKGVtcHJlc2EgPT0gIllQRiIpICU+JSANCiAgZ3JvdXBfYnkoZmVjaGEpICU+JQ0KICBzdW1tYXJpc2UodGFzYV9kZXByZWNpYWNpb24gPSBtZWFuKGRlcHJlY2lhY2lvbmVzL3BweWUpKSkkdGFzYV9kZXByZWNpYWNpb24pDQoNCiNyZXN0aW1hY2lvbiBkZSBWQlAgY3JpdGVyaW8gQ0NOTg0KdmJwX2Njbm4gPC0gdmJwX3ZhX2NpX2Njbm4gJT4lIA0KICBzZWxlY3QoYW5pbyx1bmlkYWQsIHZicF9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MsIA0KICAgICAgICAgdmFfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zLCBjaV9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MpICU+JSANCiAgZnVsbF9qb2luKGluZGljZV92YnBfY3JpdGVyaW9fY2NubiwgYnkgPSAiYW5pbyIpICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogIG11dGF0ZSh2YnBfZXh0cmFjY2lvbl9jY25uID0gY2FzZV93aGVuKA0KICAgIGFuaW8gPCAyMDA0IH4gdmJwX3ZhX2NpX2Njbm4kdmJwX2V4dHJhY2Npb25faGlkcm9jYXJidXJvc1t2YnBfdmFfY2lfY2NubiRhbmlvID09IDIwMDRdICoNCiAgICAgIHZicF9jcml0ZXJpb19jY25uXzA0LA0KICAgIGFuaW8gPiAyMDEyIH4gdmJwX3ZhX2NpX2Njbm4kdmJwX2V4dHJhY2Npb25faGlkcm9jYXJidXJvc1t2YnBfdmFfY2lfY2NubiRhbmlvID09IDIwMTJdICAqDQogICAgICB2YnBfY3JpdGVyaW9fY2Nubl8xMiwNCiAgICBUIH4gdmJwX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyksDQogICAgY2lfZXh0cmFjY2lvbl9jY25uID0gdmJwX2V4dHJhY2Npb25fY2Nubipjb2VmX3RlY25pY28sDQogICAgIyBjaV9leHRyYWNjaW9uX2Njbm4gPSB2YnBfZXh0cmFjY2lvbl9jY25uKm1lYW5fY29lZl9yZXFfZXh0cl9jY25uLA0KICAgIHZhX2V4dHJhY2Npb25fY2NubiA9IHZicF9leHRyYWNjaW9uX2Njbm4tIGNpX2V4dHJhY2Npb25fY2NubiwNCiAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIpICU+JQ0KICBsZWZ0X2pvaW4obWFzYV9zYWxhcmlhbF9oaWRyb2NhcmJ1cm9zICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICB1bmlkYWQsIG1zX2Njbm4gPSBtYXNhX3NhbGFyaWFsX29lZGUpLA0KICAgICAgICAgICAgYnkgPSBjKCJhbmlvIiwgInVuaWRhZCIpKSAlPiUNCiAgbGVmdF9qb2luKHN0b2NrX2VzdGltYWRvICU+JQ0KICAgICAgICAgICAgICAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUoY29uc3Vtb19rX2Zpam8gPSB2YWxvciAqIGlwY18xOCAqIGNvbnN1bW9fa19maWpvX3lwZikgJT4lIA0KICAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGNvbnN1bW9fa19maWpvKSkgJT4lIA0KICBtdXRhdGUobXNfY2NubiA9IGNhc2Vfd2hlbihpcy5uYShtc19jY25uKSB+dmJwX2V4dHJhY2Npb25fY2NubiptZWFuX2NvZWZfbXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBtc19jY25uKSwNCiAgICAgICAgIGViZV9jY25uID0gdmFfZXh0cmFjY2lvbl9jY25uIC1tc19jY25uIC1jb25zdW1vX2tfZmlqbywNCiAgICAgICAgIGZ1ZW50ZSA9ICJDQ05OIHJlZXN0aW1hZG8iKSAlPiUgDQogICBzZWxlY3QoYW5pbywgZnVlbnRlLCB1bmlkYWQsIA0KICAgICAgICAgIHZicF9leHRyYWNjaW9uX2Njbm4sIGNpX2V4dHJhY2Npb25fY2NubiwgdmFfZXh0cmFjY2lvbl9jY25uLCANCiAgICAgICAgICBtc19jY25uLCBjb25zdW1vX2tfZmlqbywgZWJlX2Njbm4pICU+JSANCiAgYXJyYW5nZShhbmlvKQ0KdmJwX2Njbm4NCg0KDQoNCiMgY3JpdGVyaW8gcHJvcGlhDQpwdl9oaWRyb2NhcmJ1cm9zX3Byb3BpYSA8LSAgdmJwX3ZhX2NpX3Byb3BpYSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfdmFsb3JfcHJvZHVjY2lvbiwgDQogICAgICAgICB2YnBfY3JpdGVyaW9fcHJvcGlvLCBjb25zdW1vX2ludGVybWVkaW8sdmFsb3JfYWdyZWdhZG8gKSAlPiUgDQogICBsZWZ0X2pvaW4oc3RvY2tfZXN0aW1hZG8gJT4lDQogICAgICAgICAgICAgICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lDQogICAgICAgICAgICAgICMgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllX2VzdGltYWRvX2JvbHNhciIpICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGNvbnN1bW9fa19maWpvID0gdmFsb3IgKiBpcGNfMTggKiBjb25zdW1vX2tfZmlqb195cGYpICU+JSANCiAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBjb25zdW1vX2tfZmlqbykpICU+JSANCiAgbXV0YXRlKCAjIG1hc2Ffc2FsYXJpYWwgPSB2YWxvcl9hZ3JlZ2FkbyAqIGNvZWZfc2FsYXJpbywNCiAgICBtYXNhX3NhbGFyaWFsID0gdmJwX2NyaXRlcmlvX3Byb3BpbyAqIG1lYW5fY29lZl9tcywNCiAgICAgICAgZXhjZWRlbnRlX2JydXRvX2V4cGxvdGFjaW9uID0gIHZhbG9yX2FncmVnYWRvIC0gbWFzYV9zYWxhcmlhbCAtIGNvbnN1bW9fa19maWpvKQ0KICANCiMgIkNyaXRlcmlvIHByb3BpbyBjb24gVkJQIENDTk4iIA0KcHZfaGlkcm9jYXJidXJvcyA8LSBwdl9oaWRyb2NhcmJ1cm9zX2Njbm4gJT4lIA0KICByZW5hbWUodmJwX2Njbm4gPSB2YWxvcl9icnV0b19wcm9kdWNjaW9uLA0KICAgICAgICAgdmFfY2NubiA9IHZhbG9yX2FncmVnYWRvLA0KICAgICAgICAgY2lfY2NubiA9IGNvbnN1bW9faW50ZXJtZWRpbywNCiAgICAgICAgIG1zX2Njbm4gPSBtYXNhX3NhbGFyaWFsLA0KICAgICAgICAgY29lZl9yZXFfY2NubiA9IGNvZWZfcmVxX2V4dHIsDQogICAgICAgICBlYmVfY2Nubj0gZXhjZWRlbnRlX2JydXRvX2V4cGxvdGFjaW9uKSAlPiUgDQogIGZ1bGxfam9pbihwdl9oaWRyb2NhcmJ1cm9zX3Byb3BpYSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgLA0KICAgICAgICAgICAgICAgIHZicF9jcml0ZXJpb19wcm9waW8sIGNpX2NyaXRlcmlvX3Byb3BpbyA9IGNvbnN1bW9faW50ZXJtZWRpbywNCiAgICAgICAgICAgICAgICB2YV9jcml0ZXJpb19wcm9waW8gPSB2YWxvcl9hZ3JlZ2FkbyAsIGNvbnN1bW9fa19maWpvX3Byb3BpbyA9IGNvbnN1bW9fa19maWpvKSkgICU+JQ0KICAjIGxlZnRfam9pbih2YnBfdmFfY2lfcHJvcGlhICU+JSANCiAgIyAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdmJwX2NyaXRlcmlvX2Njbm4gKSkgJT4lIA0KICBsZWZ0X2pvaW4odmJwX2Njbm4gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdmJwX2NyaXRlcmlvX2Njbm4gPSB2YnBfZXh0cmFjY2lvbl9jY25uLA0KICAgICAgICAgICAgICAgICAgICAgY2kgPSBjaV9leHRyYWNjaW9uX2Njbm4sIG1zID0gbXNfY2NubikpICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogIG11dGF0ZSh2YnAgPSB2YnBfY3JpdGVyaW9fcHJvcGlvICwNCiAgICAgICAgICMgY2kgPSBjYXNlX3doZW4oaXMubmEoY2lfY2NubikgfiB2YnBfY3JpdGVyaW9fY2NubiAqIGNvZWZfdGVjbmljbyAgLCBUIH4gIGNpX2Njbm4pLA0KICAgICAgICAgdmEgPSB2YnBfY3JpdGVyaW9fcHJvcGlvIC0gY2ksDQogICAgICAgICAjIG1zID0gY2FzZV93aGVuKGlzLm5hKG1zX2Njbm4pIH4gdmJwX2NyaXRlcmlvX2Njbm4qIG1lYW5fY29lZl9tcywgVCB+ICBtc19jY25uKSwNCiAgICAgICAgIGViZSA9ICB2YSAtIG1zIC1jb25zdW1vX2tfZmlqb19wcm9waW8pDQogICAgICAgICAgDQoNCiMjIw0KdmFsb3JfdG90YWxfcHJvZHVjY2lvbiA8LSBwdl9oaWRyb2NhcmJ1cm9zX2Njbm4gJT4lICAjIG5vIHRpZW5lIGRlc2NvbnRhZG8gc2VydmljaW9zDQogbXV0YXRlKGZ1ZW50ZSA9ICJDQ05OIikgJT4lIA0KICAgZnVsbF9qb2luKHB2X2hpZHJvY2FyYnVyb3NfcHJvcGlhICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGNvbnN1bW9fa19maWpvKSkgJT4lICANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZnVlbnRlLHZhbG9yX2JydXRvX3Byb2R1Y2Npb24sdmFsb3JfYWdyZWdhZG8sDQogICAgICAgICBjb25zdW1vX2ludGVybWVkaW8sIG1hc2Ffc2FsYXJpYWwsIGV4Y2VkZW50ZV9icnV0b19leHBsb3RhY2lvbiwgY29uc3Vtb19rX2Zpam8pICU+JSANCiAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDQ6bmNvbCguKSkgJT4lIA0KICBiaW5kX3Jvd3MocHZfaGlkcm9jYXJidXJvc19wcm9waWEgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoZnVlbnRlID0gIkNyaXRlcmlvIFByb3BpbyIpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgDQogICAgICAgICAgICAgICAgICAgICBmdWVudGUsDQogICAgICAgICAgICAgICAgICAgICB2YWxvcl9icnV0b19wcm9kdWNjaW9uID0gdmJwX2NyaXRlcmlvX3Byb3BpbywNCiAgICAgICAgICAgICAgICAgICAgIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgICAgICAgICAgICAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLA0KICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAgICAgICAgICAgICAgNDpuY29sKC4pKSkgJT4lDQogIGJpbmRfcm93cyhwdl9oaWRyb2NhcmJ1cm9zICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGZ1ZW50ZSA9ICJDcml0ZXJpbyBwcm9waW8gY29uIFZCUCBDQ05OIikgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBmdWVudGUsIHZhbG9yX2JydXRvX3Byb2R1Y2Npb24gPSB2YnAsIA0KICAgICAgICAgICAgICAgICAgIGNvbnN1bW9faW50ZXJtZWRpbyA9IGNpLCANCiAgICAgICAgICAgICAgICAgICB2YWxvcl9hZ3JlZ2Fkbz0gdmEsIA0KICAgICAgICAgICAgICAgICAgIG1hc2Ffc2FsYXJpYWwgPSBtcywgDQogICAgICAgICAgICAgICAgICAgZXhjZWRlbnRlX2JydXRvX2V4cGxvdGFjaW9uID0gZWJlLA0KICAgICAgICAgICAgICAgICAgIGNvbnN1bW9fa19maWpvPSBjb25zdW1vX2tfZmlqb19wcm9waW8pICU+JSANCiAgICAgICAgICAgICAgIGdhdGhlcihrZXkgPSB2YXJpYWJsZSwNCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgICAgICAgICAgICAgIDQ6bmNvbCguKSkpICU+JSANCiAgYmluZF9yb3dzKHZicF92YV9jaV9wcm9waWEgJT4lICMgQ3JpdGVyaW8gQ0NOTi4gTm8gdGllbmUgZGVzY29udGFkbyBzZXJ2aWNpb3MgDQogICAgICAgICAgICAgIGxlZnRfam9pbihzdG9ja19lc3RpbWFkbyAlPiUgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoLXVuaWRhZCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICMgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllX2VzdGltYWRvX2JvbHNhciIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSAiYW5pbyIpICU+JQ0KICAgICAgICAgICAgICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgICU+JQ0KICAgICAgICAgICAgICBkaXN0aW5jdCgpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUoY29uc3Vtb19rX2Zpam8gPSB2YWxvciAqIGlwY18xOCAqIGNvbnN1bW9fa19maWpvX3lwZiwNCiAgICAgICAgICAgICAgICAgICAgIGZ1ZW50ZSA9ICJDcml0ZXJpbyBDQ05OIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbG9yX2FncmVnYWRvID0gdmJwX2NyaXRlcmlvX2Njbm4gLSBjb25zdW1vX2ludGVybWVkaW8sDQogICAgICAgICAgICAgICAgICAgICBtYXNhX3NhbGFyaWFsID0gbWVhbl9jb2VmX21zICogdmJwX2NyaXRlcmlvX2Njbm4sDQogICAgICAgICAgICAgICAgICAgICBleGNlZGVudGVfYnJ1dG9fZXhwbG90YWNpb24gPXZhbG9yX2FncmVnYWRvLSAgbWFzYV9zYWxhcmlhbC1jb25zdW1vX2tfZmlqbywNCiAgICAgICAgICAgICAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBjb3JyaWVudGVzIikgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIGZ1ZW50ZSwNCiAgICAgICAgICAgICAgICAgICAgdmFsb3JfYnJ1dG9fcHJvZHVjY2lvbiA9IHZicF9jcml0ZXJpb19jY25uLA0KICAgICAgICAgICAgICAgICAgIGNvbnN1bW9faW50ZXJtZWRpbywNCiAgICAgICAgICAgICAgICAgICB2YWxvcl9hZ3JlZ2FkbywNCiAgICAgICAgICAgICAgICAgICBtYXNhX3NhbGFyaWFsLA0KICAgICAgICAgICAgICAgICAgIGV4Y2VkZW50ZV9icnV0b19leHBsb3RhY2lvbiAsIGNvbnN1bW9fa19maWpvKSAlPiUNCiAgICAgICAgICAgICAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLA0KICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAgICAgICAgICAgICAgNDpuY29sKC4pKSkgJT4lDQogIGJpbmRfcm93cyh2YnBfY2NubiAlPiUgIyBDQ05OIFJlZXN0aW1hZG8sIHRpZW5lIGRlc2NvbnRhZG8gc2VyaXZpY2lvcw0KICAgICAgICAgICAgICAjc2VsZWN0KC1jb25zdW1vX2tfZmlqbykgJT4lIA0KICAgICAgICAgICAgICByZW5hbWUodmFsb3JfYnJ1dG9fcHJvZHVjY2lvbiA9IHZicF9leHRyYWNjaW9uX2Njbm4sIA0KICAgICAgICAgICAgICAgICAgIGNvbnN1bW9faW50ZXJtZWRpbyA9IGNpX2V4dHJhY2Npb25fY2NubiwNCiAgICAgICAgICAgICAgICAgICB2YWxvcl9hZ3JlZ2FkbyA9dmFfZXh0cmFjY2lvbl9jY25uLA0KICAgICAgICAgICAgICAgICAgIG1hc2Ffc2FsYXJpYWwgPW1zX2Njbm4sDQogICAgICAgICAgICAgICAgICAgZXhjZWRlbnRlX2JydXRvX2V4cGxvdGFjaW9uID1lYmVfY2NubikgJT4lIA0KICAgICAgICAgICAgICBnYXRoZXIoa2V5ID0gdmFyaWFibGUsDQogICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgICAgICAgICAgICAgICA0Om5jb2woLikpKSAlPiUNCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JSANCiAgbXV0YXRlKHZhbG9yID0gdmFsb3IgL2lwY18xOCwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikgJT4lDQogIHNlbGVjdCgtaXBjXzE4KSAlPiUgDQogIGZpbHRlcighaXMubmEoZnVlbnRlKSkNCnZhbG9yX3RvdGFsX3Byb2R1Y2Npb24NCg0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojR3JhZmljbw0KZ3JhZl92YWxvcl9wcm9kdWNjaW9uIDwtIHZhbG9yX3RvdGFsX3Byb2R1Y2Npb24gJT4lIA0KICBmaWx0ZXIoYW5pbyA+IDE5NjApICU+JSANCiAgZ2dwbG90KCBhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gZnVlbnRlKSkrDQogIGdlb21fbGluZShhbHBoYSA9IDAuNykrDQogIGdlb21fcG9pbnQoc2l6ZSA9IDAuNDM1LCBhbHBoYSA9IDAuMikrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlZhbG9yIGRlIGxhIFByb2R1Y2Npw7NuIGhpZHJvY2FyYnVyw61mZXJhIiwgDQogICAgICAgc3VidGl0bGUgPSAiVmFsb3IgdG90YWwgeSBjb21wb25lbnRlcyIsDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQogIGZhY2V0X3dyYXAofnZhcmlhYmxlKQ0KZ2dwbG90bHkoZ3JhZl92YWxvcl9wcm9kdWNjaW9uLCB3aWR0aCA9IDc1MCwgaGVpZ2h0ID0gNDAwKQ0KDQoNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQp2YnBfdmFfY2lfcHJvcGlhICU+JSANCiAgc2VsZWN0KGFuaW8sIHZhbG9yX2JydXRvX2NydWRvLCB2YWxvcl9icnV0b19nYXMpICU+JSANCiAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLCB2YWx1ZSA9ICB2YWxvciwgMjozKSAlPiUgDQogICAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JSANCiAgbXV0YXRlKHZhbG9yID0gdmFsb3IgL2lwY18xOCwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikgJT4lIA0KICBzZWxlY3QoLWlwY18xOCkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBmaWxsID0gdmFyaWFibGUpKSsNCiAgZ2VvbV9jb2woKSsNCiAgIGxhYnModGl0bGUgPSAiVmFsb3IgQnJ1dG8gZGUgbGEgUHJvZHVjY2nDs24gaGlkcm9jYXJidXLDrWZlcmEiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJEZXNhZ3JlZ2FjacOzbiBlbiBwZXRyw7NsZW8geSBnYXMiLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKQ0KYGBgDQoNCg0KDQoNCg0KIyBDw6FsY3Vsb3MgZGUgVGFzYSBkZSBHYW5hbmNpYQ0KDQoNCiQkVEdfe2hpZHJvY2FyYnVyb3N9ID0gXGZyYWN7UFZfe2hpZHJvY2FyYnVyw61mZXJhfX17S1RBX3toaWRyb2NhcmJ1csOtZmVyb319JCQNCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KI2xldmFudG8gZGF0YSBzZXRzIGRlIG90cm8gUiBtYXJrZG93bg0KYmFsYW5jZXNfYXJnIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9CYWxhbmNlcy9nYXMgeSBwZXRyb2xlb19kYXRvcy9kYXRvc19yL3Jlc3VsdGFkb3MvYmFsYW5jZXNfYXJnLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoZmVjaGEgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJVktJW0tJWQiKSwgWDEgPSBjb2xfc2tpcCgpKSkNCg0KcGV0cm9icmFzX2FyZ19zZWdtZW50b3MgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0JhbGFuY2VzL2dhcyB5IHBldHJvbGVvX2RhdG9zL2RhdG9zX3IvcmVzdWx0YWRvcy9wZXRyb2JyYXNfYXJnX3NlZ21lbnRvcy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpDQoNCnlwZl9zZWdtZW50b3MgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0JhbGFuY2VzL2dhcyB5IHBldHJvbGVvX2RhdG9zL2RhdG9zX3IvcmVzdWx0YWRvcy95cGZfc2VnbWVudG9zLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkNCg0KDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ3JhZl90Z19lbXAgPC0gYmFsYW5jZXNfYXJnICU+JQ0KICBmaWx0ZXIodGdfYW50ICE9IEluZikgJT4lIA0KICBnZ3Bsb3QoYWVzKGZlY2hhLCB0Z19hbnQsIGNvbG9yID0gZW1wcmVzYSkpKyANCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQogIGxhYnModGl0bGUgPSAiVGFzYSBkZSBnYW5hbmNpYSBlbXByZXNhcyBoaWRyb2NhcmJ1cm9zIiwNCiAgICAgICBzdWJ0aXRsZSA9ICAiQW50ZXMgZGUgaW1wdWVzdG9zIikrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSsNCiAgZmFjZXRfd3JhcCh+c2VjdG9yKQ0KDQpnZ3Bsb3RseShncmFmX3RnX2VtcCwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ3JhZl90Z195cGYgPC0geXBmX3NlZyAlPiUgDQogICMgZmlsdGVyKHNlY3RvciAlaW4lIGMoInF1aW1pY2EiLCAiZG93bnN0cmVhbSIsICJ1cHN0cmVhbSIpKSAlPiUNCiAgZmlsdGVyKHNlY3RvciAhPSAiYWRtX2NlbnRyYWwiKSAlPiUNCiAgZ2dwbG90KGFlcyhmZWNoYSwgdGdfYWN0aXZvLCBjb2xvciA9IHNlY3RvcikpKyANCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgIyBmYWNldF93cmFwKH5zZWN0b3IpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpKw0KICBsYWJzKHRpdGxlID0gIlRhc2EgZGUgZ2FuYW5jaWEgZGUgc2VnbWVudG9zIFlQRiIpDQpncmFmX3RnX3lwZg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdyYWZfdGdfcGV0cm9icmFzIDwtIHBldHJvYnJhc19hcl9zZWcgJT4lIA0KICBmaWx0ZXIoc2VjdG9yICVpbiUgYygicGV0cm9xdWltaWNhIiwgImRvd25zdHJlYW0iLCAidXBzdHJlYW0iLCAiZ2FzX3lfZW5lcmdpYSIpKSAlPiUNCiAgIyBmaWx0ZXIoc2VjdG9yICE9ICJhZG1fY2VudHJhbCIpICU+JQ0KICBnZ3Bsb3QoYWVzKGZlY2hhLCB0ZywgY29sb3IgPSBzZWN0b3IpKSsNCiAgZ2VvbV9saW5lKCkrDQogICMgZmFjZXRfd3JhcCh+c2VjdG9yKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSsNCiAgbGFicyh0aXRsZSA9ICJUYXNhIGRlIGdhbmFuY2lhIGRlIHNlZ21lbnRvcyBQZXRyb2JyYXMgQXJnZW50aW5hIikNCmdyYWZfdGdfcGV0cm9icmFzDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICAgLGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD01fQ0KI0VzdGltYWNpw7NuIGRlIHRhc2EgZGUgZ2FuYW5jaWEgdG90YWwgcmFtYQ0KDQp0YXNhX2dhbmFuY2lhX3JhbWFfZmx1am8gPC0gdmFsb3JfdG90YWxfcHJvZHVjY2lvbiAlPiUNCiAgZmlsdGVyKHZhcmlhYmxlID09ICJleGNlZGVudGVfYnJ1dG9fZXhwbG90YWNpb24iICYgZnVlbnRlID09ICJDcml0ZXJpbyBwcm9waW8gY29uIFZCUCBDQ05OIiApICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXhjZWRlbnRlX2JydXRvX2V4cGxvdGFjaW9uID0gdmFsb3IpICU+JSANCiAgbGVmdF9qb2luKHN0b2NrX3lfcG96b3MgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHBweWUgPSBwcHllX2VzdGltYWRvLCBzdG9ja19zZWxlY2Npb25hZG8gPSBmdWVudGVfcHB5ZSwgZnVlbnRlX3Bvem8pLA0KICAgICAgICAgICAgYnkgPSBjKCJhbmlvIikpICU+JSANCiAgbXV0YXRlKHRhc2FfZ2FuYW5jaWEgPSBleGNlZGVudGVfYnJ1dG9fZXhwbG90YWNpb24vcHB5ZSkNCg0KZ3JhZl90Z19yYW1hXzEgPC0gdGFzYV9nYW5hbmNpYV9yYW1hX2ZsdWpvICU+JSANCiAgZmlsdGVyKGFuaW8gPjE5NjApICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB0YXNhX2dhbmFuY2lhLCBjb2xvciA9ZnVlbnRlX3Bvem8gKSkrDQogIGdlb21fbGluZShhbHBoYSA9IDAuNSkrDQogIGdlb21fcG9pbnQoKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiVGFzYSBkZSBnYW5hbmNpYSBoaWRyb2NhcmJ1csOtZmVyYSBjb24gUFB5RSBhIHBhcnRpciBkZSBmbHVqbyBkZSBwb3pvcygxOTYwIC0gMjAxOCkiKSsNCiAgZmFjZXRfd3JhcCh+c3RvY2tfc2VsZWNjaW9uYWRvKQ0KIyBnZ3Bsb3RseShncmFmX3RnX3JhbWFfMSwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCmdyYWZfdGdfcmFtYV8xDQoNCiMjIyMjIyMjIyMjIw0KDQojICNlbCBERiB0YXNhX2dhbmFuY2lhX3JhbWFfc3RvY2sgY29udGllbmUgbGFzIGVzdGltYWNpb25lcyBkaXN0aW50YXMgZXN0aW1hY2lvbmVzIGRlIEtUQSBjb24gc3RvY2sgZGUgcG96b3MgDQojIHRhc2FfZ2FuYW5jaWFfcmFtYV9zdG9jayA8LSB2YWxvcl90b3RhbF9wcm9kdWNjaW9uICU+JQ0KIyAgIGZpbHRlcih2YXJpYWJsZSA9PSAiZXhjZWRlbnRlX2JydXRvX2V4cGxvdGFjaW9uIiAmIGZ1ZW50ZSA9PSAiQ3JpdGVyaW8gcHJvcGlvIGNvbiBWQlAgQ0NOTiIgKSAlPiUgDQojICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXhjZWRlbnRlX2JydXRvX2V4cGxvdGFjaW9uID0gdmFsb3IpICU+JSANCiMgICBsZWZ0X2pvaW4oc3RvY2tfZXN0aW1hZG8gJT4lIA0KIyAgICAgICAgICAgICAgICMgZmlsdGVyKHZhcmlhYmxlICVpbiUgYygicHB5ZV9lc3RpbWFkb19hZmlwIiwgInBweWVfZXN0aW1hZG9fYm9sc2FyIiwNCiMgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgInBweWVfZXN0aW1hZG9fdG90YWwiKSkgJT4lDQojICAgICAgICAgICAgICAgIyBmaWx0ZXIodmFyaWFibGUgPT0gInBweWVfZXN0aW1hZG9fYm9sc2FyIikgJT4lDQojICAgICAgICAgICAgICAgIyBmaWx0ZXIodmFyaWFibGUgPT0gInBweWVfZXN0aW1hZG9fdG90YWwiKSAlPiUNCiMgICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCAgcHB5ZSA9IHZhbG9yLCBzdG9ja19zZWxlY2Npb25hZG8gPSBmdWVudGVfcHB5ZSkgJT4lIA0KIyAgICAgICAgICAgICAgIG11dGF0ZSh1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKSAlPiUgDQojICAgbXV0YXRlKHRhc2FfZ2FuYW5jaWEgPSBleGNlZGVudGVfYnJ1dG9fZXhwbG90YWNpb24vcHB5ZSkNCiMgDQojIGdyYWZfdGdfcmFtYV8yIDwtIHRhc2FfZ2FuYW5jaWFfcmFtYV9zdG9jayAlPiUgDQojICAgZmlsdGVyKGFuaW8gPjE5NjApICU+JSANCiMgICBnZ3Bsb3QoYWVzKGFuaW8sIHRhc2FfZ2FuYW5jaWEsIGNvbG9yID0gc3RvY2tfc2VsZWNjaW9uYWRvKSkrDQojICAgZ2VvbV9saW5lKGFscGhhID0gMC41KSsNCiMgICBnZW9tX3BvaW50KCkrDQojICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQojICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksDQojICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KIyAgIGxhYnModGl0bGUgPSAiVGFzYSBkZSBnYW5hbmNpYSBoaWRyb2NhcmJ1csOtZmVyYSBjb24gUFB5RSBhIHBhcnRpciBkZSBzdG9jayBkZSBwb3pvcyAoMTk2MCAtIDIwMTgpIikNCiMgIyBnZ3Bsb3RseShncmFmX3RnX3JhbWFfMiwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCiMgZ3JhZl90Z19yYW1hXzINCg0KYGBgDQoNCiMjIFJlbnRhIGFwcm9waWFkYSBwb3IgbGFzIGVtcHJlc2FzIGRlIGxhIHJhbWENCg0KTGEgcmVudGEgYXByb3BpYWRhIHBvciBsYXMgZW1wcmVzYXMgZGUgbGEgcmFtYSBzZSBjYWxjdWxhIHBvciBtZWRpbyBkZWwgZGlmZXJlbmNpYWwgZGUgdGFzYXMgZGUgZ2FuYW5jaWEgZW50cmUgZWwgc2VjdG9yIGhpZHJvY2FyYnVyw61mZXJvIHF1ZSBzdXJnZSBhIHBhcnRpciBkZSBsb3MgYmFsYW5jZXMgeSBsYSByZW50YWJpbGlkYWQgbm9ybWFsIGRlIGxhIGVjb25vbcOtYS4NCg0KJCRSZW50YVxfZW1wcmVzYXMgPSBLVEFfe2hpZHJvY2FyYnVyw61mZXJvfSAqIChUR197aGlkcm9jYXJidXLDrWZlcmF9IC0gVEdfe3JlZmVyZW5jaWF9KSQkDQokJFRHX3toaWRyb2NhcmJ1csOtZmVyYX0gPSBcZnJhY3tHY2lhX3toaWRyb2NhcmJ1cm9zfX17S1RBX3toaWRyb2NhcmJ1csOtZmVyb319JCQgDQpQb3IgbG8gY3VhbCwgbGEgcmVudGEgYXByb3BpYWRhIHBvciBsYXMgZW1wcmVzYXMgZGUgbGEgcmFtYSBzZXLDrWEgZXF1aXZhbGVudGUgYToNCg0KJCRSZW50YVxfZW1wcmVzYXMgPSBHY2lhX3toaWRyb2NhcmJ1cm9zfSAtIEtUQV97aGlkcm9jYXJidXLDrWZlcm99ICogIFRHX3tyZWZlcmVuY2lhfSQkDQoNCkRvbmRlOg0KDQoqICRLVEFfe2hpZHJvY2FyYnVyw61mZXJvfSQgPSBTdG9jayBkZSBjYXBpdGFsIGFkZWxhbnRhZG8gZGUgZW1wcmVzYXMgaGlkcm9jYXJidXLDrWZlcmFzDQoqICRUR197aGlkcm9jYXJidXLDrWZlcmF9JCA9IFRhc2EgZGUgZ2FuYW5jaWEgZGUgZW1wcmVzYXMgaGlkcm9jYXJidXLDrWZlcmFzDQoqICRUR197cmVmZXJlbmNpYX0kID0gVGFzYSBkZSBnYW5hbmNpYSBkZSByZWZlcmVuY2lhDQoqICRHY2lhX3toaWRyb2NhcmJ1cm9zfSQgPSBHYW5hbmNpYSBkZSBlbXByZXNhcyBoaWRyb2NhcmJ1csOtZmVyYXMNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KICANCnRnX2luZHVzdHJpYWwgPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9URy90Z19pbmR1c3RyaWFsLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGFzLmRvdWJsZShhbmlvKSkNCg0KcmVudGFfdGcgPC0gIHRhc2FfZ2FuYW5jaWFfcmFtYV9mbHVqbyAlPiUNCiAgc2VsZWN0KGFuaW8sICBzdG9ja19zZWxlY2Npb25hZG8sIGZ1ZW50ZV9wb3pvLCBwcHllICwgdGFzYV9nYW5hbmNpYSkgJT4lIA0KICBmaWx0ZXIoc3RvY2tfc2VsZWNjaW9uYWRvID09ICJwcHllX2JvbHNhciIsZnVlbnRlX3Bvem8gPT0gInBvem9zX2NhcmdhZG9zX3NlY19lbmVyZ2lhIiApICU+JSANCiAgbGVmdF9qb2luKHRnX2luZHVzdHJpYWwsIGJ5ID0gImFuaW8iKSAlPiUgDQogIHJlbmFtZSh0Z19oaWRyb2NhcmJ1cm9zID0gdGFzYV9nYW5hbmNpYSkgJT4lIA0KICBtdXRhdGUocmVudGFfY29uX3RnX2ppYyA9IHBweWUgKih0Z19oaWRyb2NhcmJ1cm9zIC0gdGdfaW5kdV9qaWMpLA0KICAgICAgICAgcmVudGFfY29uX3RnX2VtID0gcHB5ZSAqKHRnX2hpZHJvY2FyYnVyb3MgLSB0Z19pbmR1X2VtKSwNCiAgICAgICAgIHVuaW9uX3RnID0gY2FzZV93aGVuKGFuaW8gPCAxOTkzIH4gdGdfaW5kdV9qaWMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID49IDE5OTMgfiB0Z19pbmR1X2VtKSkgJT4lIA0KICBkaXN0aW5jdCgpDQoNCmdyYWZfdGdfcmFtYSA8LSByZW50YV90ZyAlPiUNCiAgZ2F0aGVyKGtleSA9IHRpcG9fcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHJlbnRhLA0KICAgICAgICAgODo5KSAlPiUgDQogIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgcmVudGEsIGZpbGwgPSB0aXBvX3JlbnRhKSkrIA0KICBnZW9tX2NvbChwb3NpdGlvbiA9ImRvZGdlIikrDQogICMgZ2VvbV9wb2ludCgpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHBvciBkaWZlcmVuY2lhbCBkZSB0YXNhcyBkZSBnYW5hbmNpYSIsDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQ0KZ2dwbG90bHkoZ3JhZl90Z19yYW1hLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcmVudGFfZW1wcmVzYXNfYmFsYW5jZXMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0JhbGFuY2VzL2dhcyB5IHBldHJvbGVvX2RhdG9zL2RhdG9zX3IvcmVzdWx0YWRvcy9yZW50YV9lbXByZXNhLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgDQoNCnJlbnRhX3Byb2R1Y2Npb25fYmFsYW5jZXMgPC0gIHJlbnRhX2VtcHJlc2FzX2JhbGFuY2VzICU+JSANCiAgZmlsdGVyKCEoZW1wcmVzYSAlaW4lIGMoImNoZXZyb24iLCAicGV0cm9icmFzX2dsb2IiICkpLA0KICAgICAgICAgc2VjdG9yICVpbiUgYyggImludGVncmFkYSIsICJwcm9kdWNjaW9uIikNCiAgICAgICAgICkgJT4lIA0KICBncm91cF9ieShmZWNoYSwgdW5pZGFkKSAlPiUgDQogIHN1bW1hcmlzZShLVEEgPSBzdW0oS1RBLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgZ2FuYW5jaWFfZW1wcmVzYXNfYW50ZXNfaW1wdWVzdG9zID0gc3VtKGdjaWFfYW50LCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgZ2FuYW5jaWFfZW1wcmVzYXNfZGVzcF9pbXB1ZXN0b3MgPSBzdW0oZ2NpYV9kZXNwLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgcmVudGFfZW1wcmVzYXNfYW50ZXNfaW1wdWVzdG9zID0gc3VtKHJlbnRhX2FudF9jb3JyLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgcmVudGFfZW1wcmVzYXNfZGVzcF9pbXB1ZXN0b3MgPSBzdW0ocmVudGFfZGVzcF9jb3JyLCBuYS5ybSA9IFQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSggYW5pbyA9IHllYXIoZmVjaGEpKSAlPiUgDQogIHNlbGVjdChhbmlvLCBldmVyeXRoaW5nKC4pLCAtZmVjaGEpDQoNCmdyYWZfcmVudGFfZW1wIDwtIHJlbnRhX2VtcHJlc2FzX2JhbGFuY2VzICU+JQ0KICBmaWx0ZXIoc2VjdG9yICE9ICJkaXN0cmlidWNpb24iKSAlPiUgDQogIGZpbHRlcighaXMubmEocmVudGFfZGVzcF9wMTgpLA0KICAgICAgICAgIShlbXByZXNhICVpbiUgYygiY2hldnJvbl9nbG9iYWwiLCAicGV0cm9icmFzX2dsb2JhbCIgKSkpICU+JSANCiAgZ2dwbG90KGFlcyhmZWNoYSwgcmVudGFfZGVzcF9wMTgsIGZpbGwgPSBlbXByZXNhKSkgKyANCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAic3RhY2siKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSBwb3IgZW1wcmVzYSIsDQogICAgICAgc3VidGl0bGUgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIpKw0KICBmYWNldF93cmFwKH5zZWN0b3IpDQoNCmdncGxvdGx5KGdyYWZfcmVudGFfZW1wLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KDQpgYGANCg0KDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmVqZXJjaWNpbyA8LSB2YWxvcl90b3RhbF9wcm9kdWNjaW9uICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJ2YWxvcl9hZ3JlZ2FkbyIpICU+JSANCiAgIyBmdWxsX2pvaW4oc3RvY2tfcmFtYSAlPiUNCiAgIyAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcmFtYSA9IHNlY3RvciwgYWN0aXZvcyA9IHZhcmlhYmxlLCB2YWxvcl9hY3Rpdm9zID0gdmFsb3IsIA0KICAjICAgICAgICAgICAgICAgICAgICBmdWVudGVfYWN0aXZvcyA9IGZ1ZW50ZSkgJT4lIA0KICAjICAgICAgICAgICAgICMgZmlsdGVyKGZ1ZW50ZV9hY3Rpdm9zID09ICJBRklQIikpJT4lDQogICMgICAgICAgICAgICAgZmlsdGVyKGZ1ZW50ZV9hY3Rpdm9zID09ICJCb2xzYXIiKSklPiUNCiAgZnVsbF9qb2luKHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzICU+JQ0KICAgICAgICAgICAgICB1bmdyb3VwKCkgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoZW1wcmVzYSA9PSAiWVBGIikgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcmFtYSA9IHNlY3RvciwgYWN0aXZvcyA9IHZhcmlhYmxlLCB2YWxvcl9hY3Rpdm9zID0gdmFsb3IpKSAlPiUgDQogICAgICAgICAgICAgICMgZmlsdGVyKGZ1ZW50ZV9hY3Rpdm9zID09ICJCb2xzYXIiKSklPiUNCiAgbXV0YXRlKHJlbGFjaW9uID0gdmFsb3JfYWN0aXZvcy92YWxvcikgJT4lIA0KICBmaWx0ZXIoYW5pbyA+IDE5OTAsICEoaXMubmEoYWN0aXZvcykpKQ0KZWplcmNpY2lvICAgICAgICAgICAgDQogIA0KZ3JhZl9yZWxhY2lvbiA8LSBlamVyY2ljaW8gJT4lIA0KICAjIGdncGxvdCggYWVzKGFuaW8sIHJlbGFjaW9uLCBjb2xvciA9IHJhbWEpKSsNCiAgZ2dwbG90KCBhZXMoYW5pbywgcmVsYWNpb24sIGNvbG9yID0gZnVlbnRlKSkrDQogICMgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiQWN0aXZvIHNvYnJlIHZhbG9yIGFncmVnYWRvIikrDQogIGZhY2V0X3dyYXAofmFjdGl2b3MpIA0KDQpnZ3Bsb3RseShncmFmX3JlbGFjaW9uLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KDQoNCmBgYA0KDQoNCg0KIyBSZW50YSBwb3IgZWwgZGlmZXJlbmNpYWwgZGUgcHJlY2lvcyBlbnRyZSBlbCBtZXJjYWRvIGludGVybm8geSBsYXMgcmVmZXJlbmNpYXMgaW50ZXJuYWNpb25hbGVzIA0KDQpSZW50YSBhcHJvcGlhZGEgbWVkaWFudGUgZWwgYWJhcmF0YW1pZW50byBlbiBlbCBjb25zdW1vIGludGVybm8gcG9yIGVmZWN0byBkZWwgZGlmZXJlbmNpYWwgZGUgcHJlY2lvcyBpbnRlcm5vL2V4dGVybm8sIHNvYnJldmFsdWFjacOzbiBkZSBsYSBtb25lZGEgeSByZXRlbmNpb25lcyBhIGxhIGV4cG9ydGFjacOzbg0KDQoNCiMjIyBDcml0ZXJpbyBkZSBjw7NtcHV0byBkZSBKSyAodmFyaWFibGUgJ3JlbnRhX2RpZl9wcmVjaW9zJykNCg0KJCRSRFA9IFByb2RJbnQgKiBQZXh0ICogVENQIC0gUHJvZEludCAqIFBNSSAqIFRDQyQkDQoNCkRvbmRlOg0KDQoqICRSRFAkID0gUmVudGEgYXByb3BpYWRhIHBvciBlZmVjdG8gZGlmZXJlbmNpYWwgZGUgcHJlY2lvcyBpbnRlcm5vL2V4dGVybm8geSBzb2JyZXZhbHVhY2nDs24NCiogJE1kb0ludCQgPSBQcm9kdWNjacOzbiBkZXN0aW5hZGEgYWwgTWVyY2FkbyBJbnRlcm5vOiBQcm9kdWNjacOzbiAtIEV4cG9ydGFjaW9uZXMgLSBFeGlzdGVuY2lhcyAoYmFycmlsZXMgZGUgcGV0csOzbGVvIMOzIE1NQlRVKQ0KKiAkUGV4dCQgPSBQcmVjaW8gZGUgcmVmZXJlbmNpYSBkZWwgbWVyY2FkbyBleHRlcm5vIChVU0QpDQoqICRQTUkkID0gUHJlY2lvIGRlIHZlbnRhIGRlbCBtZXJjYWRvIGludGVybm8gKFVTRCkNCiogJFRDUCQgPSBUaXBvIGRlIENhbWJpbyBkZSBQYXJpZGFkDQoqICRUQ0MkID0gVGlwbyBkZSBDYW1iaW8gQ29tZXJjaWFsDQoNCiMjIyBDcml0ZXJpbyBkZSBjw7NtcHV0byBkZSBKSUMgeSBjaWEgKHZhcmlhYmxlICdyZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uJykNCiQkUkRQID0gTWRvSW50ICogUE1JICogKFxmcmFje1RDUH17VENDfSAgLSAxKSQkICANCg0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gPC0gcHJvZF9tZXJnZV9jcnVkbyAlPiUgDQogICMgZmlsdGVyKGFuaW8gPiAxOTkwKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByb2RfY3J1ZG8pICU+JSANCiAgbGVmdF9qb2luKGV4cG9fcV9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV4cG9fY3J1ZG8pKSAlPiUgI3VuaW9uIGNvbiBleHBvDQogIGxlZnRfam9pbihleGlzdGVuY2lhc19wZXRyb2xlbykgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoZXhpc3RlbmNpYXNfY3J1ZG89MCApKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChleHBvX2NydWRvPTAgKSkgJT4lIA0KICAjIG11dGF0ZShwcm9kX21kb19pbnRlcm5vID0gcHJvZF9jcnVkbyAtIGV4cG9fY3J1ZG8gLSBleGlzdGVuY2lhc19jcnVkbykgJT4lIA0KICBtdXRhdGUocHJvZF9tZG9faW50ZXJubyA9IHByb2RfY3J1ZG8gLSBleHBvX2NydWRvICkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX21pX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHByZWNpb19jcnVkb19tZG9pbnQpLA0KICAgICAgICAgICAgYnkgPSBjKCJhbmlvIikpICU+JSAgIyB1bm8gY29uIHByZWNpbyBpbnRlcm5vDQogIGxlZnRfam9pbihwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGJyZW50ID0gY2FzZV93aGVuKGFuaW8gPCAxOTg3IH4gYnJlbnRfaGlzdG9yaWMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID49IDE5ODcgfiBicmVudF9pZWEgKSkgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcHJlY2lvX21lX2NydWRvLCBicmVudCApLA0KICAgICAgICAgICAgYnkgPSBjKCJhbmlvIikpICU+JSAgICMgdW5vIGNvbiBwcmVjaW8gZXh0ZXJubyANCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iLCBieSA9ICJhbmlvIikgJT4lIA0KICBtdXRhdGUocmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gPSBwcm9kX21kb19pbnRlcm5vKnByZWNpb19tZV9jcnVkbyp0Y3AgLSBwcm9kX21kb19pbnRlcm5vKnByZWNpb19jcnVkb19tZG9pbnQqdGNjLA0KICAgICAgICAgcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQgPSBwcm9kX21kb19pbnRlcm5vKmJyZW50KnRjcCAtIHByb2RfbWRvX2ludGVybm8qcHJlY2lvX2NydWRvX21kb2ludCp0Y2MsDQogICAgICAgICAjIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb24gPSBwcm9kX21kb19pbnRlcm5vICpwcmVjaW9fY3J1ZG9fbWRvaW50KHRjcC90Y2MtMSksDQogICAgICAgICB1bmlkYWRfcHJlY2lvID0gInVzZCIsIHVuaWRhZF9yZW50YSA9ICJwZXNvc19jb3JyIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRpZGFkPSB1bmlkYWQgLCBwcm9kX2NydWRvLCBleHBvX2NydWRvLCBleGlzdGVuY2lhc19jcnVkbywgcHJvZF9tZG9faW50ZXJubywNCiAgICAgICAgIHVuaWRhZF9wcmVjaW8sIHByZWNpb19pbnRlcm5vX2NydWRvID0gcHJlY2lvX2NydWRvX21kb2ludCwgcHJlY2lvX2V4dGVybm9fY3J1ZG8gPSBwcmVjaW9fbWVfY3J1ZG8sDQogICAgICAgICAgdGNjLCB0Y3AsIHVuaWRhZF9yZW50YSwgDQogICAgICAgICAjIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fY3J1ZG8gPSByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uLA0KICAgICAgICAgcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8sIHJlbnRhX2RpZl9wcmVjaW9zX2JyZW50KSANCg0KDQoNCg0KZ3JhZl9kaWZfY3J1ZG8gPC0gcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gJT4lDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUgDQogIG11dGF0ZShyZW50YV9kaWZfcHJlY2lvc19jcnVkbyA9IHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvL2lwY18xOCwNCiAgICAgICAgIHJlbnRhX2RpZl9wcmVjaW9zX2JyZW50ID0gcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQvaXBjXzE4KSAlPiUgDQogIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIHNlbGVjdChhbmlvLCAxMjpuY29sKC4pICkgJT4lIA0KICBnYXRoZXIoa2V5ID0gdGlwb19yZW50YSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAzOjQpICU+JSANCiAgbXV0YXRlKHZhbG9yID0gdmFsb3IgLyAxMF42KSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdGlwb19yZW50YSwgZmlsbCA9IHRpcG9fcmVudGEpKSsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIHBldHJvbGVyYSBwb3IgZGlmZXJlbmNpYWwgZGUgcHJlY2lvcyBpbnRlcm5vIHkgZXh0ZXJubyIsDQogICAgICAgeSA9ICJNTSBkZSBwZXNvcyBkZSAyMDE4IikNCmdyYWZfZGlmX2NydWRvDQoNCg0KDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMgPC0gcHJvZF9tZXJnZV9nYXNfTU1CVFUgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcm9kX2dhcykgJT4lIA0KICBsZWZ0X2pvaW4oZXhwb19xX2dhc19NTUJUVSAlPiUgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXhwb19nYXMpKSAlPiUgDQogIG11dGF0ZShleHBvX2dhcyA9IHJlcGxhY2VfbmEoZXhwb19nYXMsIDAgKSwNCiAgICAgICAgcHJvZF9tZG9faW50ZXJubyA9IHByb2RfZ2FzIC0gZXhwb19nYXMpICU+JQ0KICBsZWZ0X2pvaW4ocHJlY2lvX21pX2dhc19NTUJUVSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8gLCBwcmVjaW9faW50ZXJub19nYXMgPSAgcHJlY2lvX2dhc19tZG9pbnQpLA0KICAgICAgICAgICAgYnkgPSAiYW5pbyIpICU+JSAgIyB1bm8gY29uIHByZWNpbyBpbnRlcm5vDQogIGxlZnRfam9pbihwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwcmVjaW9fZXh0ZXJub19nYXMpLCANCiAgICAgICAgICAgIGJ5ID0gImFuaW8iKSAlPiUgICAjIHVubyBjb24gcHJlY2lvIGV4dGVybm8NCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iLCBieSA9ICJhbmlvIikgJT4lDQogIG11dGF0ZSgNCiAgICBwcmVjaW9faW50ZXJub19nYXMgPSBwcmVjaW9faW50ZXJub19nYXMvIHRjYywNCiAgICByZW50YV9kaWZfcHJlY2lvc19nYXMgPSBwcm9kX21kb19pbnRlcm5vICogdGNwICogcHJlY2lvX2V4dGVybm9fZ2FzDQogICAgICAtIHByb2RfbWRvX2ludGVybm8gKiB0Y2MgKiBwcmVjaW9faW50ZXJub19nYXMgLA0KICAgIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb24gPSBwcm9kX21kb19pbnRlcm5vICogcHJlY2lvX2ludGVybm9fZ2FzKih0Y3AvdGNjLTEpLA0KICAgICAgdW5pZGFkX3ByZWNpbyA9ICJ1c2QiLCB1bmlkYWRfcmVudGEgPSAicGVzb3NfY29yciIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZF9jYW50aWRhZD0gdW5pZGFkICwgcHJvZF9nYXMsIGV4cG9fZ2FzLCBwcm9kX21kb19pbnRlcm5vLCANCiAgICAgICAgIHVuaWRhZF9wcmVjaW8sIHByZWNpb19pbnRlcm5vX2dhcywgcHJlY2lvX2V4dGVybm9fZ2FzLCB0Y2MsIHRjcCwNCiAgICAgICAgIHVuaWRhZF9yZW50YSwgcmVudGFfZGlmX3ByZWNpb3NfZ2FzLCByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uX2dhcyA9IHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb24gKQ0KcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMNCg0KDQoNCmdyYWZfZGlmX2dhcyA8LSByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUgDQogIG11dGF0ZShyZW50YV9kaWZfcHJlY2lvc19nYXMgPSByZW50YV9kaWZfcHJlY2lvc19nYXMvaXBjXzE4LA0KICAgICAgICAgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXMgPSANCiAgICAgICAgICAgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXMvaXBjXzE4KSAlPiUNCiAgICBzZWxlY3QoYW5pbywgMTE6bmNvbCguKSApICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMzo0KSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IHZhbG9yIC8gMTBeNikgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHRpcG9fcmVudGEsIGZpbGwgPSB0aXBvX3JlbnRhKSkrDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBnYXPDrWZlcmEgcG9yIGRpZmVyZW5jaWFsIGRlIHByZWNpb3MgaW50ZXJubyB5IGV4dGVybm8iLA0KICAgICAgIHkgPSAiTU0gZGUgcGVzb3MgZGUgMjAxOCIpKw0KICB4bGltKDE5NjAsIDIwMjEpDQpncmFmX2RpZl9nYXMNCg0KDQoNCmBgYA0KDQojIFJlbnRhIGFwcm9waWFkYSBwb3Igc29icmV2YWx1YWNpw7NuIGNhbWJpYXJpYQ0KDQoNCiQkUnNvYnJldmFsdWFjaW9uID0gRXhwbyAqIFBleHQgKiAoVENQIC0gVENDKSQkIA0KDQpEb25kZToNCiogJFJzb2JyZXZhbHVhY2lvbiQgPSBSZW50YSBhcHJvcGlhZGEgcG9yIGV4cG9ydGFjaW9uZXMgY29uIHRpcG8gZGUgY2FtYmlvIHNvYnJldmFsdWFkbw0KKiAkRXhwbyQgPSBFeHBvcnRhY2lvbmVzICAoYmFycmlsZXMgZGUgcGV0csOzbGVvIMOzIE1NQlRVKQ0KKiAkUGV4dCQgPSBQcmVjaW8gZGUgcmVmZXJlbmNpYSBkZWwgbWVyY2FkbyBleHRlcm5vIChVU0QpDQoqICRUQ1AkID0gVGlwbyBkZSBDYW1iaW8gZGUgUGFyaWRhZA0KKiAkVENDJCA9IFRpcG8gZGUgQ2FtYmlvIENvbWVyY2lhbA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcmVudGFfdGNwX2NydWRvIDwtICByZW50YV9kaWZfcHJlY2lvc19jcnVkbyAlPiUNCiAgbGVmdF9qb2luKGV4cG9fdXNkX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9fY3J1ZG9fdXNkID0gZXhwb19jcnVkbywgdW5pZGFkX2V4cG8gPSB1bmlkYWQgKSkgJT4lIA0KICAgbXV0YXRlKHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvID0gZXhwb19jcnVkbypwcmVjaW9fZXh0ZXJub19jcnVkbyp0Y3AgLSBleHBvX2NydWRvKnByZWNpb19leHRlcm5vX2NydWRvKnRjYywNCiAgICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkb192YWxvciA9IGV4cG9fY3J1ZG9fdXNkKiB0Y3AgLSBleHBvX2NydWRvX3VzZCogdGNjLCANCiAgICAgICAgIHVuaWRhZF9wcmVjaW8gPSAidXNkIiwgdW5pZGFkX3JlbnRhID0gInBlc29zX2NvcnIiLA0KICAgICAgICAgZGlmID0gcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8vcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG9fdmFsb3ItMSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRpZGFkICwgZXhwb19jcnVkbywNCiAgICAgICAgIHVuaWRhZF9leHBvLCBleHBvX2NydWRvX3VzZCwNCiAgICAgICAgIHVuaWRhZF9wcmVjaW8sIHByZWNpb19leHRlcm5vX2NydWRvICwNCiAgICAgICAgICB0Y2MsIHRjcCwgdW5pZGFkX3JlbnRhLA0KICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8sIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvX3ZhbG9yLCBkaWYpICANCnJlbnRhX3RjcF9jcnVkbw0KDQpyZW50YV90Y3BfZ2FzIDwtICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyAlPiUgDQogICBtdXRhdGUocmVudGFfc29icmV2YWx1YWNpb25fZ2FzID0gZXhwb19nYXMqcHJlY2lvX2V4dGVybm9fZ2FzKnRjcCAtIGV4cG9fZ2FzKnByZWNpb19leHRlcm5vX2dhcyp0Y2MsDQogICAgICAgICB1bmlkYWRfcHJlY2lvID0gInVzZCIsIHVuaWRhZF9yZW50YSA9ICJwZXNvc19jb3JyIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRpZGFkICwgZXhwb19nYXMsIA0KICAgICAgICAgdW5pZGFkX3ByZWNpbywgcHJlY2lvX2V4dGVybm9fZ2FzICwNCiAgICAgICAgICB0Y2MsIHRjcCwgdW5pZGFkX3JlbnRhLA0KICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fZ2FzKSAgDQoNCg0KDQpgYGANCg0KDQoNCiMgUmVudGEgYXByb3BpYWRhIHBvciBlbCBFc3RhZG8gbWVkaWFudGUgaW1wdWVzdG9zIGVzcGVjw61maWNvcw0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KDQpyZXRlbmNpb25lc19jYW1wb2RvbmljbyA8LSByZWFkX2V4Y2VsKCIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9yZXRlbmNpb25lcy54bHN4IiAsIA0KICAgIHNoZWV0ID0gInVzZCIpICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbCAlPiUgc2VsZWN0KC1UQ1ApKSAlPiUgDQogIG11dGF0ZShyZXRlbmNpb25lc19oYyA9IHJldGVuY2lvbmVzX2hnICogVENDICogMTAwMDAwMCwNCiAgICAgICAgIHVuaWRhZCA9ICJhcnMiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHJldGVuY2lvbmVzX2hjKQ0KDQpyZXRlbmNpb25lc19jcnVkbyA8LSByZWFkX2V4Y2VsKCAiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvcmV0ZW5jaW9uZXMueGxzeCIgKSAlPiUNCiAgcmVuYW1lKHJldGVuY2lvbmVzX2NydWRvX2prID0gcmV0ZW5jaW9uZXNfamssDQogICAgICAgICByZXRlbmNpb25lc19jcnVkb19iZnIgPSAicmV0ZW5jaW9uZXNfYmZyX00kMjAwOCIpICU+JSANCiAgbXV0YXRlKHJldGVuY2lvbmVzX2NydWRvX2JmciA9IHJldGVuY2lvbmVzX2NydWRvX2JmciAqIGlwYzA4X2JmciAqIDEwMDAgLA0KICAgICAgICAgdW5pZGFkID0gImFycyIpICU+JSANCiAgc2VsZWN0KC1pcGMwOF9iZnIpICU+JSANCiAgbGVmdF9qb2luKHJldGVuY2lvbmVzX2NhbXBvZG9uaWNvKQ0KDQoNCnJlbnRlbmNpb25lc19yZWdhbGlhcyA8LSByZWdhbGlhcyAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2UocmVnYWxpYXNfdG90YWwgPSBzdW0ocmVnYWxpYXNfdG90YWwsIG5hLnJtID0gVCkpICU+JSANCiAgbGVmdF9qb2luKHJldGVuY2lvbmVzX2NydWRvICU+JSBzZWxlY3QoLWMocmV0ZW5jaW9uZXNfY3J1ZG9fYmZyLCByZXRlbmNpb25lc19oYykpKSANCg0KDQoNCnJldGVuY2lvbmVzX2NydWRvDQoNCg0KYGBgDQoNCg0KDQoNCiQkUmltcCA9IFJFICsgUmVnJCQNCg0KRG9uZGU6DQoNCiogJFJpbXAkID0gUmVudGEgYXByb3BpYWRhIHBvciBlbCBFc3RhZG8gbWVkaWFudGUgaW1wdWVzdG9zIGVzcGVjw61maWNvcw0KKiAkUkUkID0gUmV0ZW5jaW9uZXMNCiogJFJlZyQgPSBSZWdhbGlhcw0KDQojIFJlbnRhIGFwcm9waWFkYSBwb3IgY29uc3VtaWRvcmVzIHkgcmVmaW5lcsOtYXMgeSBwcm9jZXNhZG9yYXMNCg0KIyMjIENyaXRlcmlvIGRlIGPDs21wdXRvIGRlIFJhbcOzbiAoMjAxOSkNCg0KIyMjIyBSZWZpbmVyw61hcyB5IHByb2Nlc2Fkb3Jhcw0KDQokJFJSID0gKFBJIC0gUFJNaSkgKiBDcnVkb1AkJA0KDQoNCg0KKiAkUlIkID0gUmVudGEgYXByb3BpYWRhIHBvciBsYXMgUmVmaW5hZG9yYXMgDQoqICRQSSQgPSBwcm9tZWRpbyBwb25kZXJhZG8gZGUgUHJlY2lvcyBJbnRlcm5hY2lvbmFsZXMgDQoqICRQUk1pJCA9IFByZWNpbyBwb25kZXJhZG8gYSBSZWZpbmVyw61hcyBkZWwgTWVyY2FkbyBJbnRlcm5vDQoqICRDcnVkb1AkID0gYmFycmlsZXMgZGUgQ3J1ZG8gUHJvY2VzYWRvIHBvciBsYXMgcmVmaW5hZG9yYXMNCg0KIyMjIyBDb25zdW1pZG9yZXMNCg0KJCRSQyA9IChQSSAtIFBSTWkgLSBNUikgKiBDcnVkb1AgJCQNCg0KKiAkUkMkID0gUmVudGEgYXByb3BpYWRhIHBvciBsb3MgQ29uc3VtaWRvcmVzDQoqICRNUiQgPSBNYXJnZW4gZGUgUmVmaW5lcsOtYXMNCg0KRXN0byByZXN1bHRhIGVxdWl2YWxlbnRlIGEgcGxhbnRlYXI6DQoNCiQkUkMgPSBQQ01pICogQ3J1ZG9QJCQNCg0KKiAkUENNaSQgPSBQcmVjaW8gcG9uZGVyYWRvIGEgQ29uc3VtaWRvcmVzIGRlbCBNZXJjYWRvIEludGVybm8uDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQoNCmBgYA0KDQoNCg0KDQojIFJlbnRhIEhpZHJvY2FyYnVyw61mZXJhIFRvdGFsLiBFbiBwcmVjaW9zIGNvbnN0YW50ZXMsIHNvYnJlIFBsdXN2YWzDrWEgVG90YWwgeSBQQkkNCg0KRXhpc3RlbiBkb3MgY2FtaW5vcyBwYXJhIGxsZWdhciBhbCBtb250byB0b3RhbCBkZSByZW50YSBkZSBsYSB0aWVycmEgaGlkcm9jYXJidXLDrWZlcmE6IHVubyBlcyBkZXNjb250YW5kbyBsYSBnYW5hbmNpYSBub3JtYWwgZGUgbGFzIGVtcHJlc2FzIGEgbGEgcGx1c3ZhbMOtYSB0b3RhbCBkZWwgc2VjdG9yIHkgZWwgb3RybyBlcyBwb3IgbWVkaW8gZGUgbGEgc3VtYSBkZSBtZWNhbmlzbW9zIGRlIGFwcm9waWFjacOzbi4NCg0KJCRSZW50YVxfaGlkcm9jYXJidXLDrWZlcmEgPSBQVl97aGlkcm9jYXJidXLDrWZlcmF9IC0gR2NpYVxfTm9ybWFsX3toaWRyb2NhcmJ1csOtZmVyYX0kJA0KRG9uZGU6DQoNCiogJEdjaWFcX05vcm1hbF97aGlkcm9jYXJidXLDrWZlcmF9JCA9IEdhbmFuY2lhIE5vcm1hbCBkZWwgc2VjdG9yIGhpZHJvY2FyYnVyw61mZXJvDQoqICRQVl97aGlkcm9jYXJidXLDrWZlcmF9JCA9IFBsdXN2YWzDrWEgZGVsIHNlY3RvciBoaWRyb2NhcmJ1csOtZmVybyAgDQoNCiQkR2NpYVxfTm9ybWFsX3toaWRyb2NhcmJ1csOtZmVyYX0gPSBLVEFfe2hpZHJvY2FyYnVyw61mZXJvfSAqIFRHX3tyZWZlcmVuY2lhfSQkDQoNCg0KRG9uZGU6DQoNCiogJEtUQV97aGlkcm9jYXJidXJvc30kID0gU3RvY2sgZGUgY2FwaXRhbCBhZGVsYW50YWRvIGRlbCBzZWN0b3IgaGlkcm9jYXJidXLDrWZlcm8gDQoqICRUR197cmVmZXJlbmNpYX0kID0gVGFzYSBkZSBnYW5hbmNpYSBub3JtYWwgZGUgcmVmZXJlbmNpYS4NCg0KRW4gZXN0ZSBjYXNvLCBzZWxlY2Npb25hbW9zIGxhIHRhc2EgZGUgZ2FuYW5jaWEgZGVsIHNlY3RvciBpbmR1c3RyaWFsIGNvbW8gcGFyw6FtZXRybyBwYXJhIGRpZmVyZW5jaWFyIGxhIHJlbnRhIGRlIGxhIGdhbmFuY2lhLiBBIHN1IHZleiwgcGFyYSBlbCBjYXBpdGFsIHRvdGFsIGFkZWxhbnRhZG8gZGUgbGFzIGVtcHJlc2FzIGhpZHJvY2FyYnVyw61mZXJhcywgc2VsZWNjaW9uYW1vcyB1bmljYW1lbnRlIGVsIHZhbG9yIHJlc3VsdGFudGUgZGUgbGEgZXN0aW1hY2nDs24gZGUgbGEgUFB5RSBkZSBCb2xzYXIgYSBwYXJ0aXIgZGVsIGluZGljZSBkZSBmbHVqbyBkZSBwb3pvcyAodmFyaWFibGUgInBweWVfYm9sc2FyX2ZsdWpvIiksIHBvciBsbyBxdWUgbGUgZmFsdGFuIGxvcyBpbnZlbnRhcmlvcyB5IHNhbGFyaW9zIGFkZWxhbnRhZG9zLg0KDQpFbCBjw6FsY3VsbyBkZSByZW50YSB0b3RhbCBoaWRyb2NhcmJ1csOtZmVyYSBxdWUgc2Ugb2J0aWVuZSBwb3IgbWVkaW8gZGUgZGVzY29udGFyIGxhIGdhbmFuY2lhIG5vcm1hbCBhIGxhIHBsdXN2YWzDrWEgdG90YWwgZGVsIHNlY3RvciwgZGViZSBzZXIgaWd1YWwgYSBsYSByZW50YSBvYnRlbmlkYSBwb3IgbWVkaW8gZGUgbGEgYWdyZWdhY2nDs24gZGUgbG9zIGRpc3RpbnRvcyBtZWNhbmlzbW9zIGRlIGFwcm9waWFjacOzbi4gRXMgZGVjaXI6DQoNCiQkUmVudGFcX2hpZHJvY2FyYnVyw61mZXJhID0gUmVudGFcX2RpZmVyZW5jaWFsXF9wcmVjaW9zICsgUmVudGFcX3NvYnJldmFsdWFjacOzbiArIFJlbnRhXF9lbXByZXNhcyArIEltcHVlc3Rvc1xfbmV0b3NcX2VzcGVjw61maWNvcyAkJA0KJCRJbXB1ZXN0b3NcX25ldG9zXF9lc3BlY8OtZmljb3MgPSBSZXRlbmNpb25lcyArIFJlZ2Fsw61hcyAtIFN1YnNpZGlvcyQkDQoNCiMjIFJlbnRhIHRvdGFsIGEgcGFydGlyIGRlIGRlc2N1ZW50b3Mgc29icmUgZWwgVkJQDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojIGtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvPSBUUlVFLGZpZy53aWR0aCA9IDEyMCxmaWcuaGVpZ2h0ID0gNDAwKQ0KcmVudGFfaGlkcm9jYXJidXJpZmVyYV90b3RhbCA8LSByZW50YV90ZyAlPiUgDQogIHNlbGVjdChhbmlvLCBzdG9ja19zZWxlY2Npb25hZG8sIHBweWUsDQogICAgICAgICB0Z19oaWRyb2NhcmJ1cm9zLCB1bmlvbl90ZykgJT4lIA0KICBsZWZ0X2pvaW4odmFsb3JfdG90YWxfcHJvZHVjY2lvbiAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcih2YXJpYWJsZSA9PSAiZXhjZWRlbnRlX2JydXRvX2V4cGxvdGFjaW9uIikgJT4lIA0KICAgICAgICAgICAgICByZW5hbWUoZXhjZWRlbnRlX2JydXRvX2V4cGxvdGFjaW9uID0gdmFsb3IpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KC1jKHZhcmlhYmxlKSkgJT4lIA0KICAgICAgICAgICAgICByZW5hbWUoZnVlbnRlX2djaWEgPSBmdWVudGUpKSAlPiUgDQogIGxlZnRfam9pbihzdWJzaWRpb3NfaGlkcm9jYXJidXJvcyAlPiUgDQogICAgICAgICAgICAgIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpLCBieSA9ImFuaW8iKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKHN1YnNpZGlvcyA9IChzdWJzaWRpb3NfZWplcy8xMF42KS9pcGNfMTgsIA0KICAgICAgICAgICAgICAgICAgICAgc3Vic2lkaW9zID1yZXBsYWNlX25hKHN1YnNpZGlvcywgMCkgKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBzdWJzaWRpb3MpKSAlPiUgDQogIG11dGF0ZShyZW50YV9jb25fdW5pb25fdGcgPSBwcHllKiAodGdfaGlkcm9jYXJidXJvcyAtIHVuaW9uX3RnKSwNCiAgICAgICAgIGdjaWFfbm9ybWFsX2hpZHJvY2FyYnVyb3MgPSBwcHllICogdW5pb25fdGcsDQogICAgICAgICByZW50YV90b3RhbCA9IGV4Y2VkZW50ZV9icnV0b19leHBsb3RhY2lvbiAtIGdjaWFfbm9ybWFsX2hpZHJvY2FyYnVyb3MgLXN1YnNpZGlvcywNCiAgICAgICAgIHByb3BvcmNpb25fc3Vic2lkaW9zID0gc3Vic2lkaW9zLw0KICAgICAgICAgICAoZXhjZWRlbnRlX2JydXRvX2V4cGxvdGFjaW9uIC0gZ2NpYV9ub3JtYWxfaGlkcm9jYXJidXJvcykpICU+JSANCiAgc2VsZWN0KGFuaW8gLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLikpDQpyZW50YV9oaWRyb2NhcmJ1cmlmZXJhX3RvdGFsDQoNCnJlbnRhX2hpZHJvY2FyYnVyaWZlcmFfdG90YWwgJT4lDQogIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgcmVudGFfdG90YWwpKSsgDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHRvdGFsIGEgcGFydGlyIGRlIGVzdGltYWNpw7NuIHByb3BpYSBkZWwgVkJQIiwNCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpKw0KICBmYWNldF93cmFwKH5mdWVudGVfZ2NpYSkNCg0KDQoNCnJlbnRhX3RvdGFsX3BiaV9wdiA8LSByZW50YV9oaWRyb2NhcmJ1cmlmZXJhX3RvdGFsICU+JSANCiAgbGVmdF9qb2luKGdhbmFuY2lhX3lfcGJpICU+JSByZW5hbWUodW5pZGFkX3BiaV9nY2lhID0gdW5pZGFkKSwgIGJ5ID0gImFuaW8iKSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpLCAgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHJlbnRhX3B2ID0ocmVudGFfdG90YWwqaXBjXzE4ICkvZ2FuYW5jaWEsIA0KICAgICAgICAgcmVudGFfcGJpID0ocmVudGFfdG90YWwqaXBjXzE4ICkvcGJpICkNCg0KDQpncmFmX3JlbnRhX3RvdGFsX3BiaV9wdiA8LSByZW50YV90b3RhbF9wYmlfcHYgJT4lIA0KICBzZWxlY3QoYW5pbywgZnVlbnRlX2djaWEsIHJlbnRhX3B2LHJlbnRhX3BiaSApICU+JQ0KICAjIGZpbHRlcihhbmlvID49IDE5NjIsIGZ1ZW50ZV9nY2lhID09ICJQcm9waWEiKSAlPiUNCiAgZmlsdGVyKGFuaW8gPj0gMTk2MikgJT4lDQogIGdhdGhlcihrZXkgPSB0aXBvX3JlbnRhLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDM6NCkgJT4lDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IpKSsNCiAgIyBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICBnZW9tX2xpbmUoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgdG90YWwgc29icmUgUEJJIHkgR2FuYW5jaWFzIFRvdGFsZXMiLA0KICAgICAgIHNidXRpdGxlID0gIkEgcGFydGlyIGRlIGVzdGltYWNpw7NuIHByb3BpYSBkZWwgVkJQIiwNCiAgICAgICB5ID0gIiUiKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMikpKw0KICBmYWNldF9ncmlkKGZ1ZW50ZV9nY2lhfnRpcG9fcmVudGEgKQ0KDQojIGdyYWZfcmVudGFfdG90YWxfcGJpX3B2DQpnZ3Bsb3RseShncmFmX3JlbnRhX3RvdGFsX3BiaV9wdiwgaGVpZ2h0ID0gNDAwLCB3aWR0aCA9IDYwMCkNCg0KYGBgDQoNCg0KIyMgUmVudGEgdG90YWwgYSBwYXJ0aXIgZGUgc3VtYSBkZSBtZWNhbmlzbW9zDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpyZW50YV9wYmlfcHYgPC0gcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gJT4lIA0KICAjIHNlbGVjdChhbmlvLHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvLCByZW50YV9kaWZfcHJlY2lvc19icmVudCApICU+JQ0KICBzZWxlY3QoYW5pbyxyZW50YV9kaWZfcHJlY2lvc19jcnVkbyApICU+JQ0KICBsZWZ0X2pvaW4ocmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMgJT4lIHNlbGVjdChhbmlvLCByZW50YV9kaWZfcHJlY2lvc19nYXMpICkgJT4lIA0KICBsZWZ0X2pvaW4ocmVudGVuY2lvbmVzX3JlZ2FsaWFzICU+JSBzZWxlY3QoLXVuaWRhZCkpICU+JSANCiAgbGVmdF9qb2luKHJlbnRhX3RjcF9jcnVkbyAlPiUgc2VsZWN0KGFuaW8sIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvKSkgJT4lIA0KICBsZWZ0X2pvaW4ocmVudGFfdGNwX2dhcyAlPiUgc2VsZWN0KGFuaW8sIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcykpICU+JSANCiAgIGxlZnRfam9pbihzdWJzaWRpb3NfaGlkcm9jYXJidXJvcyAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICBzdWJzaWRpb3MgPSBzdWJzaWRpb3NfZWplcyksIGJ5ID0iYW5pbyIpICU+JSANCiAgZ3JvdXBfYnkoYW5pbyApICU+JSANCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7eCAvIDEwXjZ9KSAlPiUgI2xhcyB2YmxlcyBjYXJnYWRhcyBhbnRlcmlvcm1lbnRlIHNlIHBhc2FuIGEgTU0NCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSByZXBsYWNlX25hKHgsIDApKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogICMgbGVmdF9qb2luKHJlbnRhX3Byb2R1Y2Npb25fYmFsYW5jZXMgJT4lIHNlbGVjdChhbmlvLCByZW50YV9lbXByZXNhc19kZXNwX2ltcHVlc3RvcykpICU+JSANCiAgIyBsZWZ0X2pvaW4ocmVudGFfaGlkcm9jYXJidXJpZmVyYV90b3RhbCAlPiUNCiAgIyAgICAgICAgICAgICBmaWx0ZXIoc3RvY2tfc2VsZWNjaW9uYWRvID09ICJwcHllX2JvbHNhciIpICU+JQ0KICAjICAgICAgICAgICAgIHNlbGVjdChhbmlvLCByZW50YV9lbXByZXNhcyA9IHJlbnRhX2Nvbl91bmlvbl90ZykgJT4lIA0KICAjICAgICAgICAgICAgIG11dGF0ZShyZW50YV9lbXByZXNhcyA9IDApKSAlPiUNCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iKSAlPiUgDQogIGxlZnRfam9pbihnYW5hbmNpYV95X3BiaSAlPiUgcmVuYW1lKHVuaWRhZF9wYmlfZ2NpYSA9IHVuaWRhZCkpICU+JSANCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JSANCiAgbXV0YXRlKHJlbnRhX2RpZl9wcmVjaW9zX2dhcyA9IHJlbnRhX2RpZl9wcmVjaW9zX2dhcyAvaXBjXzE4LA0KICAgICAgICAgcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gPSByZW50YV9kaWZfcHJlY2lvc19jcnVkbyAvIGlwY18xOCwNCiAgICAgICAgICMgcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQgPSByZW50YV9kaWZfcHJlY2lvc19icmVudCAvaXBjXzE4LA0KICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8gPSByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkby9pcGNfMTgsDQogICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMgPSByZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMvaXBjXzE4LA0KICAgICAgICAgcmVnYWxpYXNfdG90YWwgPSByZWdhbGlhc190b3RhbCAvIGlwY18xOCwNCiAgICAgICAgIHJldGVuY2lvbmVzX2NydWRvX2prID0gcmV0ZW5jaW9uZXNfY3J1ZG9famsgLyBpcGNfMTgsIA0KICAgICAgICAgc3Vic2lkaW9zID0gc3Vic2lkaW9zL2lwY18xOCwNCiAgICAgICAgICMgcmVudGFfZW1wcmVzYXNfZGVzcF9pbXB1ZXN0b3MgPSByZW50YV9lbXByZXNhc19kZXNwX2ltcHVlc3Rvcy9pcGNfMTgsDQogICAgICAgICByZW50YV90b3RhbCA9IHJlbnRhX2RpZl9wcmVjaW9zX2dhcysgcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gKw0KICAgICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyArIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcyArDQogICAgICAgICAgIHJlZ2FsaWFzX3RvdGFsICsgIHJldGVuY2lvbmVzX2NydWRvX2prIC0gc3Vic2lkaW9zLA0KICAgICAgICAgcHJvcG9yY2lvbl9zdWJzaWRpb3MgPSBzdWJzaWRpb3MvKHJlbnRhX2RpZl9wcmVjaW9zX2dhcysgcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gKw0KICAgICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyArIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcyArDQogICAgICAgICAgIHJlZ2FsaWFzX3RvdGFsICsgIHJldGVuY2lvbmVzX2NydWRvX2prKSAgLA0KICAgICAgICAgcmVudGFfcHYgPSAocmVudGFfdG90YWwqaXBjXzE4KS9nYW5hbmNpYSwNCiAgICAgICAgIHJlbnRhX3BiaSA9IChyZW50YV90b3RhbCppcGNfMTgpL3BiaSwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyAyMDE4IiwNCiAgICAgICAgIHJlbnRhX3VzZF90Y2MgPSAocmVudGFfdG90YWwqaXBjXzE4KSAvIHRjYywgDQogICAgICAgICByZW50YV91c2RfdGNwID0gKHJlbnRhX3RvdGFsKmlwY18xOCkgLyB0Y3AsKSAgJT4lIA0KICByZW5hbWUocmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMgPSByZW50YV9kaWZfcHJlY2lvc19nYXMsDQogICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2NydWRvID0gcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8sDQogICAgICAgICAjIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfYnJlbnQgPSByZW50YV9kaWZfcHJlY2lvc19icmVudCwNCiAgICAgICAgIHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2NydWRvID0gcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8gLA0KICAgICAgICAgcmVudGFfZXhwb19zb2JyZXZhbHVhZGFfZ2FzID0gcmVudGFfc29icmV2YWx1YWNpb25fZ2FzKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGlwY18xOCwgZXZlcnl0aGluZyguKSkgJT4lIA0KICAjIHNlbGVjdCgtcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8pDQogICMgc2VsZWN0KC1yZW50YV9kaWZfcHJlY2lvc19icmVudCkgJT4lIA0KICBkaXN0aW5jdCgpDQoNCg0KI1JlbnRhIHRvdGFsDQpncmFmX3JlbnRhX3RvdGFsIDwtIHJlbnRhX3BiaV9wdiAlPiUNCiAgZmlsdGVyKGFuaW8gPjE5NjApICU+JSANCiAgc2VsZWN0KC1jKHVuaWRhZCwgaXBjXzE4LCByZW50YV90b3RhbCwgdGNjLCB0Y3AsIHNvYnJldmFsdWFjaW9uLA0KICAgICAgICAgICAgc3Vic2lkaW9zLCBwcm9wb3JjaW9uX3N1YnNpZGlvcykpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMjo3KSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdGlwb19yZW50YSwgZmlsbCA9IHRpcG9fcmVudGEpKSsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAic3RhY2siKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHRvdGFsIChwZXRyw7NsZW8geSBnYXMpIiwgDQogICAgICAgc3VidGl0bGUgPSAiQ3Vyc29zIGRlIGFwcm9waWFjacOzbi4gTWlsbG9uZXMgcGVzb3MgZGUgMjAxOCIsIA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKHgpIGZvcm1hdCh4LCBiaWcubWFyayA9ICIuIiwgc2NpZW50aWZpYyA9IEZBTFNFKSkrDQogIHRoZW1lX2NsYXNzaWMoKQ0KZ2dwbG90bHkoZ3JhZl9yZW50YV90b3RhbCwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCg0KIyBwcm9wb3JjaW9uIHN1YnNpZGlvcw0KcmVudGFfcGJpX3B2WyxjKCJhbmlvIiwicHJvcG9yY2lvbl9zdWJzaWRpb3MiKV0gJT4lIGFycmFuZ2UoLWFuaW8pDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KI1JlbnRhIHRjcCB5IHRjYw0KZ3JhZl9yZW50YV90b3RhbF91c2QgPC0gcmVudGFfcGJpX3B2ICU+JSANCiAgc2VsZWN0KGMoYW5pbywgcmVudGFfdXNkX3RjYywgcmVudGFfdXNkX3RjcCkpICU+JQ0KICBmaWx0ZXIoYW5pbyA+IDE5NjIpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMjozKSAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSB0aXBvX3JlbnRhKSApKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgdG90YWwgKHBldHLDs2xlbyB5IGdhcykiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJNaWxsb25lcyBkZSBVU0QiLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9ZnVuY3Rpb24oeCkgZm9ybWF0KHgsIGJpZy5tYXJrID0gIi4iLCBzY2llbnRpZmljID0gRkFMU0UpKQ0KZ2dwbG90bHkoZ3JhZl9yZW50YV90b3RhbF91c2QsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQoNCg0KDQoNCiNjb21wYXJhY2lvbiBjb24gRlINCmdyYWZfY29tcGFyYWNpb25fcmVudGFzIDwtIHJlbnRhX3BiaV9wdiAlPiUgDQogIG11dGF0ZShmdWVudGUgPSAiUHJvcGlhIHZpYSBzdW1hIGRlIG1lY2FuaXNtb3MiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsZnVlbnRlLCAgcmVudGFfdG90YWwgKSAlPiUgDQogIGJpbmRfcm93cyhyZW50YV90b3RhbF9wYmlfcHYgJT4lIA0KICAgICAgICAgICAgICAgIGZpbHRlciggZnVlbnRlX2djaWEgPT0gIlByb3BpYSIpICU+JQ0KICAgICAgICAgICAgICAgbXV0YXRlKGZ1ZW50ZSA9ICJQcm9waWEgdmlhIGRlc2N1ZW50b3Mgc29icmUgVkJQIikgJT4lIA0KICAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sZnVlbnRlLCAgcmVudGFfdG90YWwgKSApICU+JSANCiAgYmluZF9yb3dzKHJlbnRhX2hpZHJvY2FyYnVyb3NfZnIgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoZnVlbnRlID0gIkbDoXJmYXJvIFJ1aXogeSBCaWxsIikgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIGZ1ZW50ZSwgIHJlbnRhX3RvdGFsKSkgJT4lIA0KICBmaWx0ZXIoYW5pbyA+PSAxOTYyKSAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLCByZW50YV90b3RhbCwgY29sb3IgPSBmdWVudGUpKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjM1KSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHRvdGFsIChwZXRyw7NsZW8geSBnYXMpIiwgDQogICAgICAgc3VidGl0bGUgPSAiQ29tcGFyYWNpw7NuIGRlIGVzdGltYWNpb25lcy4gTWlsbG9uZXMgcGVzb3MgZGUgMjAxOCIsIA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpKw0KICB0aGVtZV9jbGFzc2ljKCkNCmdyYWZfY29tcGFyYWNpb25fcmVudGFzDQoNCg0KI3NvYnJlIHBiaSB5IHB2DQpncmFmX3JlbnRhX3RvdGFsX3B2IDwtIHJlbnRhX3BiaV9wdiAlPiUgDQogIHNlbGVjdChhbmlvLCByZW50YV9wdixyZW50YV9wYmkgKSAlPiUNCiAgZmlsdGVyKGFuaW8gPj0gMTk2MikgJT4lDQogIGdhdGhlcihrZXkgPSB0aXBvX3JlbnRhLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6MykgJT4lDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdGlwb19yZW50YSwgZmlsbCA9IHRpcG9fcmVudGEpKSsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHRvdGFsIHNvYnJlIFBCSSB5IEdhbmFuY2lhcyBUb3RhbGVzIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJTdW1hIGRlIG1lY2FuaXNtb3MiLA0KICAgICAgIHkgPSAiJSIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6cGVyY2VudCkNCg0KDQpnZ3Bsb3RseShncmFmX3JlbnRhX3RvdGFsX3B2LCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQoNCg0KI3NvbG8gcmVudGEgZW1wcmVzYXMNCiMgcmVudGFfcGJpX3B2ICU+JQ0KIyAgIGZpbHRlcihhbmlvID4gMTk2MCkgJT4lIA0KIyAgIG11dGF0ZShyZW50YV9lbXByZXNhc19wdiA9IHJlbnRhX2VtcHJlc2FzKmlwY18xOC9nYW5hbmNpYSwNCiMgICAgICAgICAgcmVudGFfZW1wcmVzYXNfcGJpID0gcmVudGFfZW1wcmVzYXMqaXBjXzE4L3BiaSkgJT4lIA0KIyAgIHNlbGVjdChhbmlvLCByZW50YV9lbXByZXNhc19wdiwgcmVudGFfZW1wcmVzYXNfcGJpKSAlPiUgDQojICAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLCB2YWx1ZSA9IHZhbG9yLCAyOjMgKSAlPiUgDQojICAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgZmlsbCA9IHZhcmlhYmxlKSkrDQojICAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiMgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQojICAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSBhcHJvcGlhZGEgcG9yIGVtcHJlc2FzIHNvYnJlIFBCSSB5IEdhbmFuY2lhcyBUb3RhbGVzIiwNCiMgICAgICAgIHkgPSAiJSIpKw0KIyAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9c2NhbGVzOjpwZXJjZW50KQ0KDQogIA0KYGBgDQoNCg0KYGBge3J9DQojIyMjIyMjIyMjIyMjIyMjIyMjIyBzb2xvIGdhcw0KIyBHYXMNCiMgcmVudGFfZ2FzX3BiaV9wdiA8LSByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyAlPiUgDQojICAgc2VsZWN0KGFuaW8scmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMsIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzICkgJT4lIA0KIyAgIGdyb3VwX2J5KGFuaW8gKSAlPiUgDQojICAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7eCAvIDEwXjZ9KSAlPiUgDQojICAgbGVmdF9qb2luKGdhbmFuY2lhX3lfcGJpKSAlPiUgDQojICAgbXV0YXRlKHJlbnRhX2RpZl9wcmVjaW9zX2dhc19wdiA9IHJlbnRhX2RpZl9wcmVjaW9zX2dhcy9nYW5hbmNpYSwNCiMgICAgICAgICAgcmVudGFfZGlmX3ByZWNpb3NfZ2FzX3BiaSA9IHJlbnRhX2RpZl9wcmVjaW9zX2dhcy9wYmksDQojICAgICAgICAgIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzX3B2ID0gcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXMvZ2FuYW5jaWEsDQojICAgICAgICAgIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzX3BiaSA9IHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzL3BiaSwNCiMgICAgICAgICAgdW5pZGFkID0gIk1NX3Blc29zX2NvcnIiKQ0KIyANCiMgZ3JhZl9yZW50YV9nYXNfcHYgPC0gcmVudGFfZ2FzX3BiaV9wdiAlPiUgDQojICAgc2VsZWN0KGFuaW8sIDc6bmNvbCguKSApICU+JSANCiMgICBnYXRoZXIoa2V5ID0gdGlwb19yZW50YSwNCiMgICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiMgICAgICAgICAgMjpuY29sKC4pKSAlPiUgDQojICAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSB0aXBvX3JlbnRhLCBmaWxsID0gdGlwb19yZW50YSkpKw0KIyAgIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikrDQojICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KIyAgIGxhYnModGl0bGUgPSAiUmVudGEgcGV0cm9sZXJhIHBvciBkaWZlcmVuY2lhbCBkZSBwcmVjaW9zIGludGVybm8geSBleHRlcm5vIHNvYnJlIFBCSSB5IEdhbmFuY2lhcyBUb3RhbGVzIiwNCiMgICAgICAgIHkgPSAiJSIpDQojIHBsb3RseTo6Z2dwbG90bHkoZ3JhZl9yZW50YV9nYXNfcHYpDQpgYGANCg0KIyMgQ29zdG9zDQoNCiQkUVxfdG90YWwgPSBRX3twZXRyw7NsZW99ICsgUV97Z2FzfSAkJA0KRG9uZGU6DQogIA0KICAqICRRXF90b3RhbCQgPSBDYW50aWRhZGVzIHByb2R1Y2lkYXMgZGUgcGV0csOzbGVvIHkgZ2FzIGVuIEJhcnJpbGVzIEVxdWl2YWxlbnRlcyBkZSBQZXRyw7NsZW8NCiAgKiAkUV97cGV0csOzbGVvfSQgPSBDYW50aWRhZGVzIHByb2R1Y2lkYXMgZGUgcGV0csOzbGVvIGNydWRvIGVuIGJhcnJpbGVzIGVxdWl2YWxlbnRlcyBkZSBwZXRyw7NsZW8gKEJPRSkNCiAgKiAkUV97Z2FzfSQgPSBDYW50aWRhZGVzIHByb2R1Y2lkYXMgZGUgZ2FzIG5hdHVyYWwgZW4gYmFycmlsZXMgZXF1aXZhbGVudGVzIGRlIHBldHLDs2xlbyAoQk9FKQ0KICANCg0KJCQgQ29zdG9zXF90b3RhbGVzID0gIENJICsgTVMgKyBDb25LZmlqbyQkDQoNCkRvbmRlOg0KDQoqICRDb3N0b3NcX3RvdGFsZXMkID0gQ29zdG9zIHRvdGFsZXMgaGlkcm9jYXJidXLDrWZlcm9zDQoqICRDSSQgPSBDb25zdW1vIEludGVybWVkaW8sIGRpc3RpbnRhcyBlc3RpbWFjaW9uZXMNCiogJE1TJCA9IE1hc2EgU2FsYXJpYWwsIGRpc3RpbnRhcyBlc3RpbWFjaW9uZXMNCiogJENvbktmaWpvJCA9IENvbnN1bW8gZGUgQ2FwaXRhbCBGaWpvDQoNCg0KJCRDb3N0b3NcX3RvdGFsZXNcX2NvblxfR2NpYSA9IENvc3Rvc1xfdG90YWxlcyArIEdjaWFcX05vcm1hbF97aGlkcm9jYXJidXLDrWZlcmF9ICQkDQpEb25kZToNCg0KKiAkQ29zdG9zXF90b3RhbGVzXF9jb25cX0djaWEkID0gQ29zdG9zIHRvdGFsZXMgaGlkcm9jYXJidXLDrWZlcm9zIGNvbiBnYW5hbmNpYSBub3JtYWwgDQoqICRHY2lhXF9Ob3JtYWxfe2hpZHJvY2FyYnVyw61mZXJhfSQgPSBHYW5hbmNpYSBub3JtYWwgZGVsIHNlY3RvciBoaWRyb2NhcmJ1csOtZmVybw0KDQokJCBQcmVjaW9cX2Nvc3RvID0gXGZyYWN7Q29zdG9zXF90b3RhbGVzfXtRXF90b3RhbH0gICAkJA0KRG9uZGU6DQoqICRQcmVjaW9cX2Nvc3RvJCA9IFByZWNpbyBkZSBjb3N0byBlbiBCT0UNCg0KQSBwYXJ0aXIgZGUgZXN0byBzZSBwdWVkZSBjYWxjdWxhciB1biBjb3N0byByZWN1cGVyYWJsZSBkZWwgcGV0csOzbGVvIHkgZGVsIGdhcw0KDQokJENvc3RvXF9jcnVkbyA9IFFfe3BldHLDs2xlb30gKiBQcmVjaW9cX2Nvc3RvJCQNCiQkQ29zdG9cX2dhcyA9IFFfe2dhc30gKiBQcmVjaW9cX2Nvc3RvJCQNCg0KDQokJFByZWNpb1xfcHJvZHVjY2lvbiA9IFxmcmFje0Nvc3Rvc1xfdG90YWxlc1xfY29uXF9HY2lhfXtRXF90b3RhbH0kJA0KDQokJFByZWNpb1xfdnRhXF9wb3RlbmNpYWwgPSAgXGZyYWN7UVxfdG90YWwqUGV4dF97cGV0csOzbGVvfSAtIENvc3Rvc1xfdG90YWxlc317UVxfdG90YWx9ICQkDQoNCg0KRG9uZGU6DQoqICRQcmVjaW9cX3Byb2R1Y2Npb24kPSBQcmVjaW8gZGUgcHJvZHVjY2lvbg0KKiAkUHJlY2lvX3Z0YV9wb3RlbmNpYWwkID0gUHJlY2lvIGRlIHZlbnRhIHBvdGVuY2lhbA0KKiAkUGV4dF97cGV0csOzbGVvfSQgPSBQcmVjaW8gZGUgZXhwb3J0YWNpw7NuL3JlZmVyZW5jaWEgaW50ZXJuYWNpb25hbCBkZWwgcGV0csOzbGVvIGNydWRvDQoNCmBgYHtyfQ0KI2VzdGltYWNpb24gY29zdG9zIHByb3BpYQ0KY29zdG9zIDwtIHByb2R1Y2Npb25fdG90YWwgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX3Byb2R1Y2Npb249dW5pZGFkLA0KICAgICAgICAgcHJvZHVjY2lvbl9jcnVkbyA9cHJvZF9jcnVkbywgcHJvZHVjY2lvbl9nYXM9cHJvZF9nYXMsDQogICAgICAgICBwcm9kdWNjaW9uX3RvdGFsPXByb2R1Y2Npb25fdG90YWxfYmVwKSAlPiUgDQogIGxlZnRfam9pbih2YWxvcl90b3RhbF9wcm9kdWNjaW9uICU+JSANCiAgICAgICAgICAgICAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JSANCiAgICAgICAgICAgICAgbGVmdF9qb2luKHRjcF9hbnVhbF9iICU+JSBzZWxlY3QoLXNvYnJldmFsdWFjaW9uKSkgJT4lDQogICAgICAgICAgICAgIGZpbHRlcih2YXJpYWJsZSAlaW4lIGMoImNvbnN1bW9faW50ZXJtZWRpbyIsICJtYXNhX3NhbGFyaWFsIiwiY29uc3Vtb19rX2Zpam8iICksDQogICAgICAgICAgICAgICAgICAgICBmdWVudGUlaW4lIGMoIkNyaXRlcmlvIENDTk4iLCAiQ0NOTiIpKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKHZhbG9yID0gKHZhbG9yKjEwXjYpKmlwY18xOC90Y2MsDQogICAgICAgICAgICAgICAgICAgICB1bmlkYWQgPSJVU0QgdGNjIikgJT4lIA0KICAgICAgICAgICAgICBzcHJlYWQoa2V5PXZhcmlhYmxlLCB2YWx1ZT12YWxvcikpICU+JSANCiAgbGVmdF9qb2luKHJlbnRhX2hpZHJvY2FyYnVyaWZlcmFfdG90YWwgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgc3RvY2tfc2VsZWNjaW9uYWRvLA0KICAgICAgICAgICAgICAgICAgICAgcHB5ZSwgdGdfbm9ybWFsPXVuaW9uX3RnLCByZW50YV90b3RhbCkgKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX3JlZmVyZW5jaWFfZXh0ZXJubyA9IHByZWNpb19tZV9jcnVkbykpICU+JSANCiAgbXV0YXRlKHBweWUgPSAocHB5ZSoxMF42KSppcGNfMTgvdGNjLA0KICAgICAgICAgcmVudGFfdG90YWwgPSAocmVudGFfdG90YWwqMTBeNikqaXBjXzE4L3RjYywNCiAgICAgICAgIHVuaWRhZF9jb3N0b3M9ICJVU0QvYm9lIiwNCiAgICAgICAgIGNvc3Rvc190b3RhbGVzID0gKGNvbnN1bW9faW50ZXJtZWRpbyArbWFzYV9zYWxhcmlhbCArIGNvbnN1bW9fa19maWpvKSwNCiAgICAgICAgIGNvc3Rvc190b3RhbGVzX3N1bV9nY2lhX25vcm1hbCA9IGNvc3Rvc190b3RhbGVzICsgKHBweWUgICogdGdfbm9ybWFsKSwNCiAgICAgICAgIHByZWNpb19jb3N0byA9IGNvc3Rvc190b3RhbGVzL3Byb2R1Y2Npb25fdG90YWwsDQogICAgICAgICBwcmVjaW9fY29zdG9fbW1idHUgPSBjb252ZXJzb3JfYmVwTU1CVFVfcChwcmVjaW9fY29zdG8pLA0KICAgICAgICAgcHJlY2lvX3Byb2R1Y2Npb24gPWNvc3Rvc190b3RhbGVzX3N1bV9nY2lhX25vcm1hbC9wcm9kdWNjaW9uX3RvdGFsLA0KICAgICAgICAgcHJlY2lvX3ZlbnRhX3BvdGVuY2lhbCA9IChwcm9kdWNjaW9uX3RvdGFsICpwcmVjaW9fcmVmZXJlbmNpYV9leHRlcm5vIC0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0b3NfdG90YWxlcykvcHJvZHVjY2lvbl90b3RhbCApDQogICAgICAgICAjIHByZWNpb192ZW50YV9wb3RlbmNpYWwgPSAoKHBweWUgKiB0Z19ub3JtYWwpK3JlbnRhX3RvdGFsKS9wcm9kdWNjaW9uX3RvdGFsKQ0KIyAocHJvZHVjY2lvbiB4IHByZWNpbyBpbnRlcm5hY2lvbmFsIC0gY29zdG9zX3RvdGFsZXMpIC8gYmFycmlsZXMgQk9FID0gZ2NpYSArIHJlbnRhIHBvciBiYXJyaWwgDQojZXhwcmVzYXIgZW4gdXNkIHRjYyB5IHRjcA0KY29zdG9zDQoNCmBgYA0KDQpgYGB7cn0NCmNvc3RvcyAlPiUgDQogICAgICAgICAgIGZpbHRlcihhbmlvID4gMTk2MCkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHByZWNpb19jb3N0bywgY29sb3IgPSBmdWVudGUpKSsgDQogIGdlb21fbGluZSgpKw0KICAgIGxhYnModGl0bGUgPSAiUHJlY2lvIGRlIGNvc3RvIiwNCiAgICAgICAgIHN1YnRpdGxlPSAiRXN0aW1hY2lvbiBwcm9waWEgYSBwYXJ0aXIgZGUgQ0NOTiB5IHJlZXN0aW1hY2lvbiBkZSBWQlAgY29uIGNyaXRlcmlvIENDTk4iLCANCiAgICAgICAgIHkgPSAiVVNEL0JPRSIsIHggPSAiQcOxbyIpDQoNCg0KYGBgDQoNCiMgQ29tcGFyYWNpw7NuIGNvbiBlc3RpbWFjacOzbiBkZSBvdHJvcyBhdXRvcmVzDQoNCmBgYHtyfQ0KDQojcmVudGEgdXNkIHZzIGF1dG9yZXMNCnJlbnRhX3VzZCA8LSByZW50YV9wYmlfcHYgJT4lIA0KICBzZWxlY3QoYW5pbyx0Y2MsIGlwY18xOCwgcmV0ZW5jaW9uZXNfY3J1ZG9famssIHJlZ2FsaWFzX3RvdGFsLCBjb250YWlucygicmVudGEiKSkgJT4lIA0KICBzZWxlY3QoIC0oMTI6bmNvbCguKSkpICU+JSANCiAgZmlsdGVyKGFuaW8gPiAxOTYyKSAlPiUNCiAgbXV0YXRlKCByZXRlbmNpb25lc19jcnVkb19qaz0gcmV0ZW5jaW9uZXNfY3J1ZG9famsqaXBjXzE4L3RjYywgICAgICAgDQogICAgICAgICAgcmVnYWxpYXNfdG90YWwgPSByZWdhbGlhc190b3RhbCppcGNfMTgvdGNjLCANCiAgICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2NydWRvID0gcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19jcnVkbyppcGNfMTgvdGNjLA0KICAgICAgICAgIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzID0gcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMqaXBjXzE4L3RjYywNCiAgICAgICAgICByZW50YV9leHBvX3NvYnJldmFsdWFkYV9jcnVkbyA9IHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2NydWRvKmlwY18xOC90Y2MsICANCiAgICAgICAgICByZW50YV9leHBvX3NvYnJldmFsdWFkYV9nYXMgPSByZW50YV9leHBvX3NvYnJldmFsdWFkYV9nYXMqaXBjXzE4L3RjYyAgLA0KICAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uID0gcmVudGFfZXhwb19zb2JyZXZhbHVhZGFfY3J1ZG8rIHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2dhcywNCiAgICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zID0gDQogICAgICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcysgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19jcnVkbywNCiAgICAgICAgICAjIHJlbnRhX2VtcHJlc2FzID0gcmVudGFfZW1wcmVzYXMqaXBjXzE4L3RjYywNCiAgICAgICAgICAjIHJlbnRhX2VtcHJlc2FzX2Rlc3BfaW1wdWVzdG9zID0gcmVudGFfZW1wcmVzYXNfZGVzcF9pbXB1ZXN0b3MqaXBjXzE4L3RjYywNCiAgICAgICAgICByZW50YV90b3RhbCA9IChyZW50YV90b3RhbCppcGNfMTgpIC8gdGNjLA0KICAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBVU0QiLA0KICAgICAgICAgYXV0b3IgPSAiUHJvcGlhIikgJT4lIA0KICByZW5hbWUocmV0ZW5jaW9uZXMgPSByZXRlbmNpb25lc19jcnVkb19qaywNCiAgICAgICAgIHJlZ2FsaWFzID0gcmVnYWxpYXNfdG90YWwNCiAgICAgICAgICAjIHJlbnRhX2VtcHJlc2FzID0gcmVudGFfZW1wcmVzYXNfZGVzcF9pbXB1ZXN0b3MsDQogICAgICAgICAjIHJlbnRhX3RvdGFsX2dhcyA9IHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzLA0KICAgICAgICAgIyByZW50YV90b3RhbF9jcnVkbyA9IHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfY3J1ZG8sDQogICAgICAgICApICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgYXV0b3IsIGV2ZXJ5dGhpbmcoLiksIA0KICAgICAgICAgLWMoaXBjXzE4LCB0Y2MsIHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2NydWRvLCByZW50YV9leHBvX3NvYnJldmFsdWFkYV9nYXMsDQogICAgICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcywgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19jcnVkbykpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fZGVfcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgNDpuY29sKC4pKSAlPiUgDQogICAgYmluZF9yb3dzKHJlbnRhX2F1dG9yZXMpDQojIyMjIw0KDQoNCiNncmFmaWNvIGNvbXBhcmFjaW9uIGNvbiBvdHJvcyBhdXRvcmVzDQpncmFmX3RpcG9zX3JlbnRhIDwtIHJlbnRhX3VzZCAlPiUgDQogIGZpbHRlcighKHRpcG9fZGVfcmVudGElaW4lIGMoInJlbnRhX3RvdGFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW50YV9lc3RhZG9fdG90YWwiKSkpICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSBhdXRvcikpKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludChzaXplID0gMC41KSsNCiAgZmFjZXRfd3JhcCh+dGlwb19kZV9yZW50YSwgc2NhbGVzID0gImZyZWVfeSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIiwgDQogICAgICAgc3VidGl0bGUgPSAiQ29tcGFyYWNpw7NuIGRlIGVzdGltYWNpb25lcy4gTWlsbG9uZXMgVVNEIiwgDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBVU0QiKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KZ2dwbG90bHkoZ3JhZl90aXBvc19yZW50YSwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkgIA0KDQoNCg0KZ3JhZl9yZW50YV90b3RhbF9jb21wYXJhY2lvbiA8LSByZW50YV91c2QgJT4lIA0KICAjIGZpbHRlcighKGF1dG9yID09ICJQcm9waWEiICYgdGlwb19kZV9yZW50YSA9PSAicmVudGFfdG90YWwiKSkgJT4lDQogICMgbXV0YXRlKHRpcG9fZGVfcmVudGE9IGNhc2Vfd2hlbih0aXBvX2RlX3JlbnRhID09InJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3MiICYNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b3IgPT0gIlByb3BpYSIgfiAicmVudGFfdG90YWwiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHRpcG9fZGVfcmVudGEpKSAlPiUNCiAgZmlsdGVyKHRpcG9fZGVfcmVudGEgPT0gInJlbnRhX3RvdGFsIikgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGF1dG9yKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSB0b3RhbCAocGV0csOzbGVvIHkgZ2FzKSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkNvbiByZW50YSB0b3RhbCBwcm9waWEgbWV0b2RvbG9nw61hIGF1dG9yZXMiLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9ZnVuY3Rpb24oeCkgZm9ybWF0KHgsIGJpZy5tYXJrID0gIi4iLCBzY2llbnRpZmljID0gRkFMU0UpKQ0KZ3JhZl9yZW50YV90b3RhbF9jb21wYXJhY2lvbg0KDQpnZ3Bsb3RseShncmFmX3JlbnRhX3RvdGFsX2NvbXBhcmFjaW9uLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KIyBnZ3Bsb3RseShncmFmX3JlbnRhX3RvdGFsX2NvbXBhcmFjaW9uX2IpDQoNCmBgYA0KDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQojIyBFeHBvcnRhY2nDs24gZGUgcmVzdWx0YWRvcw0KDQp3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QocHJvZHVjY2lvbl9jcnVkbyA9IHByb2RfbWVyZ2VfY3J1ZG8sIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19pbnRlcm5vX2NydWRvID0gcHJlY2lvX21pX2NydWRvLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRhY2lvbl9jcnVkbyA9IGV4cG9fcV9jcnVkbywgDQogICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvc19leHRlcm5vX2NydWRvID0gcHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWNjaW9uX2dhcyA9IHByb2RfbWVyZ2VfZ2FzX01NQlRVLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9faW50ZXJub19nYXMgPXByZWNpb19pbnRlcm5vX2dhc19tbWJ0dV91c2QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGFjaW9uX2dhcyA9IGV4cG9fcV9nYXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19leHRlcm5vX2dhcyA9IHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzaWRpb3MgPXN1YnNpZGlvc19oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRpcG9fY2FtYmlvID0gdGNwX2FudWFsX2IsDQogICAgICAgICAgICAgICAgICAgICAgICAgaXBjID0gaXBjX3Byb21lZGlvKSwNCiAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICAicmVzdWx0YWRvcy9hcmdlbnRpbmEvdmFyaWFibGVzLnhsc3giKQ0KDQoNCndyaXRleGw6OndyaXRlX3hsc3gobGlzdChyZW50YV90b3RhbF9wdl9wYmkgPSByZW50YV9wYmlfcHYsDQogICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JfcHJvZHVjY2lvbiA9IHZhbG9yX3RvdGFsX3Byb2R1Y2Npb24gLA0KICAgICAgICAgICAgICAgICAgICAgICAgIFZBX3Byb3BpbyA9IHZicF92YV9jaV9wcm9waWEsDQogICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZG9fZGlmX3ByZWNpb3NfbXMgPSByZW50YV9kaWZfcHJlY2lvc19jcnVkbywgDQogICAgICAgICAgICAgICAgICAgICAgICAgZ2FzX2RpZl9wcmVjaW9zX21zID0gcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZG9fc29icmV2YWx1YWNpb25fbXMgPSByZW50YV90Y3BfY3J1ZG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgZ2FzX3NvYnJldmFsdWFjaW9uX21zID0gcmVudGFfdGNwX2dhcywNCiAgICAgICAgICAgICAgICAgICAgICAgICByZW50YV9iYWxhbmNlcyA9IHJlbnRhX3Byb2R1Y2Npb25fYmFsYW5jZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgIyBjcnVkb19wcmVjaW9fZXhwb19qayA9IHJlbnRhX3ByZWNpb19leHBvX2NydWRvX2prLA0KICAgICAgICAgICAgICAgICAgICAgICAgICMgZ2FzX2RpZl9wcmVjaW9zX2V4cG9famsgPSByZW50YV9wcmVjaW9fZXhwb19nYXNfamssDQogICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hY2lvbl9qayA9IHJlbnRhX2hpZHJvY2FyYnVyb3NfamspLCANCiAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL2FyZ2VudGluYS9yZW50YV9oaWRyb2NhcmJ1cm9zX3RvdGFsLnhsc3giKQ0KDQoNCndyaXRleGw6OndyaXRlX3hsc3gocmVudGFfdG90YWxfcGJpX3B2LA0KICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvYXJnZW50aW5hL3JlbnRhX3RvdGFsX1B4US54bHN4IikNCg0Kd3JpdGV4bDo6d3JpdGVfeGxzeChjb3N0b3MsDQogICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9hcmdlbnRpbmEvY29zdG9zLnhsc3giKQ0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdChwcm9kdWNjaW9uID0gcHJvZF9tZXJnZV9jcnVkbywgDQojICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRhY2lvbmVzID0gZXhwb19xX2NydWRvLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RlbmNpYXMgPSBleGlzdGVuY2lhc19wZXRyb2xlbywgDQojICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9faW50ZXJubyA9IHByZWNpb19taV9jcnVkbywgDQojICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9fZXh0ZXJubyA9IHByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8sDQojICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3AgPSB0Y3BfYW51YWxfYiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bG8gPSByZW50YV9kaWZfcHJlY2lvc19jcnVkbyksIA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9yZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2NydWRvLnhsc3giKQ0KIyANCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KHByb2R1Y2Npb24gPSBwcm9kX21lcmdlX2dhc19NTUJUVSwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRhY2lvbmVzID0gZXhwb19xX2dhc19NTUJUVSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19pbnRlcm5vID0gcHJlY2lvX21pX2dhc19NTUJUVSwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9fZXh0ZXJubyA9IHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcCA9IHRjcF9hbnVhbF9iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsbyA9IHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzKSwgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL3JlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzLnhsc3giKQ0KIyAjIA0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoImNvbiBwb3pvcyBwZXJmb3JhZG9zIHBvciBhw7FvIj0gc3RvY2tfZXN0aW1hZG8sIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbiBzdG9jayBkZSBwb3pvcyIgPSBlamVyY2ljaW9fZmRfc3RvY2ssDQojICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBwYXJ0aXIgWVBGIChmbHVqbykiID0gZWplcmNpY2lvX2ZkX3lwZiksIA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9lc3RpbWFjaW9uIGRlIHN0b2NrIGEgcGFydGlyIGRlIHBvem9zLnhsc3giKQ0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdCgiY29uIHBvem9zIHBlcmZvcmFkb3MgcG9yIGHDsW8iPSBzdG9ja195X3Bvem9zKSwgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL2VzdGltYWNpb24gZGUgc3RvY2sgYSBwYXJ0aXIgZGUgcG96b3MueGxzeCIpDQoNCg0Kd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KCJmbHVqbyI9IGNvbXBhcmFjaW9uX3Bvem9zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICJmbHVqb190b3RhbCI9IGxpc3RhZG9fcG96b3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgInN0b2NrIiA9IHBvem9zX2lhcGdfY2VudGVuYXJpbyksIA0KICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvYXJnZW50aW5hL3Bvem9zLnhsc3giKQ0KDQoNCndyaXRleGw6OndyaXRlX3hsc3gobGlzdChhZmlwID0gc3RvY2tfYWZpcCwNCiAgICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlc19ib2xzYXIgPSBzdG9ja19iYWxhbmNlc19lbXByZXNhcywNCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50b19ZUEZfUGV0QlIgPXVuaW9uX3NlZ21lbnRvcywNCiAgICAgICAgICAgICAgICAgICAgICAgICBib2xzYXJfdjIgPSBzdG9ja19iYWxhbmNlc19yYW1hLA0KICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZlcnNpb24gcG9yIHBvem8gKElBUEcpIiA9IGludmVyc2lvbl9wb3pvcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgImludmVyc2lvbiBwb3IgcG96byAoQ2FwIElWKSI9IGludmVyc2lvbl9wb3pvc19jYXBpdiksDQogICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9hcmdlbnRpbmEvc3RvY2tfcGV0cm9sZW8ueGxzeCIpDQoNCndyaXRleGw6OndyaXRlX3hsc3gobGlzdCgiVEcgaW5kaWNlIGZsdWpvIHBvem9zIj0gdGFzYV9nYW5hbmNpYV9yYW1hX2ZsdWpvLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAjICJURyBpbmRpY2UgZmx1am8gc3RvY2siID0gdGFzYV9nYW5hbmNpYV9yYW1hX3N0b2NrLA0KICAgICAgICAgICAgICAgICAgICAgICAgICJyZW50YSBlbXByZXNhcyIgPSByZW50YV90ZyksIA0KICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvYXJnZW50aW5hL3Rhc2EgZGUgZ2FuYW5jaWEgeSByZW50YSBoaWRyb2NhcmJ1csOtZmVyYS54bHN4IikNCg0KDQpwcmludCgiRWwgY8OzZGlnbyB0ZXJtaW7DsyBkZSBjb3JyZXIiKQ0KDQpgYGANCg0KDQoNCg0KDQoNCg0K